我正在尝试以编程方式设置我的自定义TabBarController的视图控制器:
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)
}
但是用行
self.viewControllers = [cameraViewController, profileViewController] as! [AnyObject]?
我收到错误,我无法将[UIViewController]转换为[AnyObject?]
和行
self.setViewControllers(controllers as! [AnyObject], animated: true)
我收到错误说:
Cannot invoke 'setViewControllers' with an argument list of type '([AnyObject], animated: Bool)'
我的问题是AnyObject和类型转换,我想。
答案 0 :(得分:2)
问题是您尝试使用的视图控制器被声明为可选:
var cameraViewController: UIViewController?
var profileViewController: UIViewController?
所以你有三个选择:
不要让它们成为可选项。这要求您在初始化TabBarViewController
时使用某些内容对其进行初始化。也许是最安全的选择。
如果您知道cameraViewController
中的profileViewController
和nil
永远不会viewDidLoad
:
self.viewControllers = [cameraViewController!, profileViewController!]
检查cameraViewController
中的profileViewController
和viewDidLoad
是否为零。这对我来说闻起来很糟糕。
if let c = cameraViewController, let p = profileViewController {
self.viewControllers = [c, p]
}
因此,归结为初始化cameraViewController
和profileViewController
的方式。是否在显示标签栏视图控制器之前设置了它们?如果是这样,我建议您在班级中添加自定义init
。