Définir les controllers de vue de UITabBarController dans Swift

J'essaye de programmer des controllers de vue de mon TabBarController personnalisé:

import UIKit class TabBarViewController: UITabBarController, UITabBarControllerDelegate { var cameraViewController: UIViewController? var profileViewController: UIViewController? override func viewDidLoad() { super.viewDidLoad() self.delegate = self //self.viewControllers = [cameraViewController, profileViewController] as! [AnyObject]? let controllers: [UIViewController?] = [cameraViewController, profileViewController] self.setViewControllers(controllers as! [AnyObject], animated: true) } 

Mais avec la ligne

 self.viewControllers = [cameraViewController, profileViewController] as! [AnyObject]? 

Je reçois une erreur que je ne peux pas convertir [UIViewController] en [AnyObject?]

et avec la ligne

 self.setViewControllers(controllers as! [AnyObject], animated: true) 

J'ai une erreur en disant:

 Cannot invoke 'setViewControllers' with an argument list of type '([AnyObject], animated: Bool)' 

Mon problème est avec AnyObject et typecasting je suppose.

Le problème est que les controllers de vue que vous essayez d'utiliser sont déclarés facultatifs:

 var cameraViewController: UIViewController? var profileViewController: UIViewController? 

Donc vous avez trois options:

  • Ne les rends pas facultatifs. Cela nécessite que vous les initialisiez avec quelque chose lorsque vous initialisez votre TabBarViewController . Peut-être l'option la plus sûre.

  • Si vous savez que profileViewController et profileViewController ne sont jamais nil dans viewDidLoad :

     self.viewControllers = [cameraViewController!, profileViewController!] 
  • Vérifiez si profileViewController et profileViewController ne sont pas nuls dans viewDidLoad . Cela sent mauvais design pour moi.

     if let c = cameraViewController, let p = profileViewController { self.viewControllers = [c, p] } 

Cela revient donc à initialiser profileViewController et profileViewController . Sont-ils définis avant que les controllers de vue de la barre d'tabs soient affichés? Si c'est le cas, je recommand d'append un init personnalisé à votre class.