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.
Essayez d'ouvrir tous les onglets avant. Peut-être que vos contrôleurs de vue ne sont pas encore chargés. – ObranS
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
@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