2017-06-12 1 views
0

actuellement j'ai une mise en page comme celle-ci avec mon application. J'ai un UITabBarcontroller en tant que contrôleur de vue racine dans le délégué de l'application, c'est très bien et fonctionne très bien.Accéder aux fonctions/variables dans un UITabBarController avec ou sans variables globales?

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

var window: UIWindow? 


func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

    FIRApp.configure() 

    window = UIWindow(frame: UIScreen.main.bounds) 
    window?.makeKeyAndVisible() 

    window?.rootViewController = Tabs() 


    UITabBar.appearance().tintColor = UIColor.init(r: 198, g: 214, b: 91) 
    UITabBar.appearance().barTintColor = UIColor.init(r: 47, g: 47, b: 47) 




    UINavigationBar.appearance().barTintColor = UIColor.init(r: 53, g: 57, b: 77) 


    UINavigationBar.appearance().tintColor = UIColor.init(r: 198, g: 214, b: 91) 

Cependant, dans ma mise en page avec le contrôleur onglet, je l'ai tracée d'une manière où je UITabBar en haut, suivie d'une fonction didload prioritaire qui définit tous les points de vue comme celui-ci.

class Tabs: UITabBarController{ 


override func viewDidLoad() { 
    super.viewDidLoad() 



    tabBar.isTranslucent = true 


    let feed = feedController() 
    let feedArray = UINavigationController(rootViewController: feed) 
    let feedButton = UITabBarItem(title: nil, image: UIImage(named: "feed.png"), selectedImage: UIImage(named: "selectedimage.png")) 
    feedButton.imageInsets = UIEdgeInsets(top: 5, left: 0, bottom: -5, right: 0) 
    feedArray.tabBarItem = feedButton 



    let messages = messagesController() 
    let messagesArray = UINavigationController(rootViewController: messages) 
    let messagesButton = UITabBarItem(title: nil, image: UIImage(named: "messages.png"), selectedImage: UIImage(named: "selectedimage.png")) 
    messagesButton.imageInsets = UIEdgeInsets(top: 5, left: 0, bottom: -5, right: 0) 
    messagesArray.tabBarItem = messagesButton 


    let post = postController() 
    let postButton = UITabBarItem(title: nil, image: UIImage(named: "post.png"), selectedImage: UIImage(named: "selectedimage.png")) 
    postButton.imageInsets = UIEdgeInsets(top: 5, left: 0, bottom: -5, right: 0) 
    post.tabBarItem = postButton 


    let profile = profileController() 


    let profileArray = UINavigationController(rootViewController: profile) 
    let profileButton = UITabBarItem(title: nil, image: UIImage(named: "profile.png"), selectedImage: UIImage(named: "selectedimage.png")) 

    profileButton.imageInsets = UIEdgeInsets(top: 5, left: 0, bottom: -5, right: 0) 
    profile.tabBarItem = profileButton 






    let settings = settingsController() 
    let settingsArray = UINavigationController(rootViewController: settings) 
    let settingsButton = UITabBarItem(title: nil, image: UIImage(named: "settings.png"), selectedImage: UIImage(named: "selectedimage.png")) 
    settingsButton.imageInsets = UIEdgeInsets(top: 5, left: 0, bottom: -5, right: 0) 
    settingsArray.tabBarItem = settingsButton 





    if FIRAuth.auth()?.currentUser?.uid == nil { 
     DispatchQueue.main.async { 


      self.handleLogout()} 
    } 


/* all views BOII */ viewControllers = [feedArray, messagesArray, post, profileArray, settingsArray] 

Cependant, lorsque je tente d'accéder à une fonction ou que ce soit dans un viewcontroller dans ce contrôleur onglet d'un autre viewcontroller intérieur. comme celui-ci

class settingsController: UIViewController{ 

messagesController().removeMessages() 

} 

.......

class messagesController: UIViewController{ 
    removeMessages(){ 
      messages.removeAll() 
      messagesDictionary.removeAll() 
      tableView.reloadData() 


      print("working") 

} 
} 

Les fonctions appelée (im mettre en fonction la déconnexion), je reçois le message d'impression, mais tout ce que je voulais affecté sur ce viewcontroller ne semble pas fonctionner. Actuellement, j'ai jusqu'ici essayé ces méthodes (sur le contrôleur de paramètres). Je sais que cela a à voir avec quelque chose avec un contrôleur de tabulation dans swift, quelque chose à propos de la façon dont les vues à l'intérieur sont parallèles les unes aux autres.

Ce que j'ai fait et cela a fonctionné, a été mettre les déclarations des variables avant la classe dans mon fichier tabs.swift. J'ai donc pris les instructions let qui configuraient les vues et les plaçaient avant que la classe ne soit déclarée et sous les déclarations d'importation. Cela a fonctionné, mais est-ce une mauvaise pratique et existe-t-il une meilleure façon de le faire? Comme ceci, les déclarations sont maintenant globales.

Vraiment apprécier l'aide les gars et je suis tellement désolé pour le long post, je voulais juste que vous essayez de comprendre ce que je dis ici, je suis nouveau.

+0

Essayez d'ouvrir tous les onglets avant. Peut-être que vos contrôleurs de vue ne sont pas encore chargés. – ObranS

+0

Si toutes les méthodes viewDidLoad s'exécutent avant que cela indique que vous appelez ces méthodes pas dans le thread principal. – ObranS

+0

@ObranS a essayé ce compagnon, c'est quelque chose à voir avec le fait qu'il soit déclaré, comme je peux le réparer en leur faisant laisser des instructions globales (les déclarant en dehors de la classe), mais je ne sais pas si c'est une mauvaise pratique. et quoi non. Merci quand même. :) – zak

Répondre

0

Si vos objets UIKit sont manipulés à partir de la pile en cours, cela ne fonctionnera pas. Puisque l'objet doit être appelé depuis le thread principal.

DispatchQueue.main.async { 
    self.handleLogout() 
} 

Je ne peux vous suggérons d'utiliser rapidement la solution de bloc suivant pour les éléments de l'interface utilisateur:

dispatch_async(dispatch_get_main_queue()) { 
    messages.removeAll() 
    messagesDictionary.removeAll() 
    tableView.reloadData() 
} 
+0

Ce n'est pas ce que j'essaie de faire mate, mais vous avez corrigé un autre bug pour moi, merci! :) – zak

+0

C'est juste le fait que je ne peux jamais accéder à des fonctions ou des variables quand j'ai deux contrôleurs intégrés dans un UITabBarController, et c'est ce que je cherche à obtenir. Même si j'ai énuméré un problème ici, il affecte l'application im essayant de construire parce que j'ai besoin de partager des fonctions entre les viewcontrollers mais je me bats aussi à cause de ce tabbarcontroller. – zak