在Swift中设置UITabBarController的视图控制器

时间:2015-07-30 09:48:51

标签: ios swift uitabbarcontroller

我正在尝试以编程方式设置我的自定义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和类型转换,我想。

1 个答案:

答案 0 :(得分:2)

问题是您尝试使用的视图控制器被声明为可选:

var cameraViewController: UIViewController?
var profileViewController: UIViewController?

所以你有三个选择:

  • 不要让它们成为可选项。这要求您在初始化TabBarViewController时使用某些内容对其进行初始化。也许是最安全的选择。

  • 如果您知道cameraViewController中的profileViewControllernil永远不会viewDidLoad

    self.viewControllers = [cameraViewController!, profileViewController!]
    
  • 检查cameraViewController中的profileViewControllerviewDidLoad是否为零。这对我来说闻起来很糟糕。

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

因此,归结为初始化cameraViewControllerprofileViewController的方式。是否在显示标签栏视图控制器之前设置了它们?如果是这样,我建议您在班级中添加自定义init