简体   繁体   中英

Set view controllers of UITabBarController in Swift

I am trying to programatically set view controllers of my custom 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)

}

But with line

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

I get an error that I cannot convert [UIViewController] to [AnyObject?]

and with line

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

I get an error saying:

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

My problem is with AnyObject and typecasting I guess.

The problem is that the view controllers you are trying to use are declared optional:

var cameraViewController: UIViewController?
var profileViewController: UIViewController?

So you have three options:

  • Don't make them optional. This requires that you initialize them with something when you initalize your TabBarViewController . Maybe the safest option.

  • If you know that cameraViewController and profileViewController are never nil in viewDidLoad :

     self.viewControllers = [cameraViewController!, profileViewController!] 
  • Check if cameraViewController and profileViewController are not nil in viewDidLoad . This smells like bad design to me though.

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

So it boils down to how you initialize cameraViewController and profileViewController . Are they set before the tab bar view controllers is shown? If so, I recommend adding a custom init to your class.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM