【问题标题】:Embedding Navigation Controller into Tab Bar Controller将导航控制器嵌入标签栏控制器
【发布时间】:2016-11-01 20:35:01
【问题描述】:

我目前有一个 DetailViewControllerViewController 分离,它嵌入在 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
        }
    }
}

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

“无法将 'UITabBarController' (0x103ff6258) 类型的值转换为 'Photomania.ItemsViewController' (0x1029520d0)。”

Error

【问题讨论】:

  • 在链接 stackoverflow.com/questions/40338691/… 上查看我的答案,然后按照答案中的第 1 步进行操作。希望这会有所帮助...
  • 感谢您的帮助,但这并不完全适用于我收到的错误。还有其他建议吗?
  • 你能发布你的故事板层次结构吗?你得到那个错误可能是你没有将navigationController配置到你的tabBarController,或者你根本没有使用navigationController,或者为你的tabBarController设置segue标识符等问题。 ..?
  • 你的答案就在你手上。如果您正确查看我对该帖子的回答..
  • @Allie 你提供的这段代码属于哪个class/viewController

标签: ios iphone swift uitabbarcontroller


【解决方案1】:

我认为您以错误的方式处理问题。您可以将ItemsViewControllerimageStoreitemStore设置为viewDidLoad

override func viewDidLoad() {
    super.viewDidLoad()
    self.itemStore  = ItemStore()
    self.imageStore = ImageStore()
}

但如果您希望在AppDelegate 中的didFinishLaunchingWithOptions 中执行此操作,那么您会这样做。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    let rootController = window?.rootViewController

    if rootController is UITabBarController {
        let firstTabItem = (rootController as! UITabBarController).viewControllers?[0]

        if firstTabItem is UINavigationController {

            let firstController = (firstTabItem as! UINavigationController).viewControllers.first as! ItemsViewController
            firstController.itemStore  = ItemStore()
            firstController.imageStore = ImageStore()
        }
    }
}

【讨论】:

  • 我认为这会起作用,除了我收到一个关于花括号的奇怪错误。我知道它们都匹配,但编译器另有说明。见图片。
  • 你指的是哪张照片?是的,你是对的,花括号确实匹配。
  • 我刚刚也将图片添加到我原来的问题中。
  • 是的,我看到了这张照片,真的很奇怪,因为牙套没有问题。只需清理项目并尝试构建。或者您可以简单地注释掉引发此错误的函数。
  • 我该怎么做?我什么都没看到。
【解决方案2】:

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

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

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

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

【讨论】:

  • 我的标签栏顺序正确,第一个 viewController 是导航视图控制器。同样的错误继续发送。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多