将导航控制器嵌入标签栏控制器

时间:2016-11-01 20:35:02

标签: ios iphone swift uitabbarcontroller

我目前有DetailViewController来自ViewController的{​​{1}},它嵌入UINavigationViewController,我想嵌入UITabBarController。当我第一次在storyboard上执行此操作时,我的应用程序因错误而崩溃:

  

"无法转换类型' UITabBarController' (0x10badf258)到' UINavigationController' (0x10badf208)"

经过研究,我添加了前两行(let tabVc =, and let navVc = )并仍然崩溃。创建成功的TabBarController

我缺少什么?
 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let tabVc = segue.destinationViewController as! UITabBarController
    let navVc = tabVc.viewControllers!.first as! UINavigationController

    if segue.identifier == "ShowItem" {
        if let row = tableView.indexPathForSelectedRow?.row {
            let item = itemStore.allItems[row]
            let detailViewController = segue.destinationViewController as! DetailViewController
            detailViewController.item = item
            detailViewController.imageStore = imageStore
        }
    }
}

Storyboard

更新:应用更改后,我的错误已更改为

  

"无法转换类型' UITabBarController' (0x103ff6258)to' Photomania.ItemsViewController' (0x1029520d0)"

Error

2 个答案:

答案 0 :(得分:0)

正如错误明确指出的那样,这行代码失败了:

let navVc = tabVc.viewControllers!.first as! UINavigationController

根据错误,tabVC中的第一个viewController不是navigationVC。

因此,请确保标签栏的排列顺序正确,并确保tabVC的第一个viewController确实是导航视图控制器。

答案 1 :(得分:0)

我认为你正在以错误的方式解决问题。您可以在imageStore中设置itemStore的{​​{1}}和ItemsViewController

viewDidLoad

但如果您希望在override func viewDidLoad() { super.viewDidLoad() self.itemStore = ItemStore() self.imageStore = ImageStore() } 的{​​{1}}中执行此操作,那么您就是这样做的。

didFinishLaunchingWithOptions