Establecer controlleres de vista de UITabBarController en Swift

Estoy intentando configurar programáticamente los controlleres de vista de mi TabBarController personalizado:

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) } 

Pero con linea

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

Aparece un error que no puedo convertir [UIViewController] a [AnyObject?]

y con linea

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

Recibo un error que dice:

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

Mi problema es con AnyObject y supongo que creo.

El problema es que los controlleres de vista que intenta utilizar se declaran opcionales:

 var cameraViewController: UIViewController? var profileViewController: UIViewController? 

Entonces tienes tres opciones:

  • No las hagas opcionales. Esto requiere que los inicialices con algo cuando TabBarViewController . Tal vez la opción más segura.

  • Si sabe que cameraViewController y profileViewController nunca son nil en viewDidLoad :

     self.viewControllers = [cameraViewController!, profileViewController!] 
  • Compruebe si cameraViewController y profileViewController no son nil en viewDidLoad . Sin embargo, esto me huele a mal layout.

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

Entonces se networkinguce a cómo inicializa cameraViewController y profileViewController . ¿Se configuran antes de que se muestren los controlleres de vista de barra de tabs? Si es así, recomiendo agregar un init personalizado a su class.