将Tab Bar Controller嵌入导航控制器时prepareForSegue

时间:2016-07-05 11:31:25

标签: swift uiviewcontroller uinavigationcontroller uitabbarcontroller

我目前有这样的导航控制器设置:

enter image description here

和我的prepareForSegue,它在初始视图(Login View Controller)和Navigation控制器之间传递数据,如下所示:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        super.prepareForSegue(segue, sender: sender)
        let navVc = segue.destinationViewController as! UINavigationController // 1
        let chatVc = navVc.viewControllers.first as! ChatViewController // 2
        chatVc.senderId = userID // 3
        chatVc.senderDisplayName = "" // 4
    }

然而,当我尝试嵌入Tab Bar控制器(为我的应用添加更多页面/功能)时,这样......

enter image description here

...并运行我的应用程序,我的程序在let navVc = segue.destinationViewController as! UINavigationController

崩溃

我知道问题在于,在我的初始视图之后,它会转到标签栏UITabBarController而不是UINavigationController但是如果我更改它,我的数据不会转到视图我希望它去...它有点令人困惑。

如果您有任何想法如何实施,请告诉我,或者如果您有任何问题,请随时向我澄清。

谢谢!

P.S。我在控制台中收到的错误是:

Could not cast value of type 'UITabBarController' (0x10b8e48b0) to 'UINavigationController' (0x10b8e4860).

4 个答案:

答案 0 :(得分:3)

试试这个:

首先将destinationViewController转换为UITabBarController,然后使用viewControllers属性访问tabBarController中的第一个viewController:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    let tabVc = segue.destinationViewController as! UITabBarController
    let navVc = tabVc.viewControllers!.first as! UINavigationController
    let chatVc = navVc.viewControllers.first as! ChatViewController
    chatVc.senderId = userID
    chatVc.senderDisplayName = ""
}

答案 1 :(得分:1)

在CS193p课程中,Paul Hegarty展示了extension s用于处理导航控制器段的用法(讲座8:23')。 UIViewController扩展引入了一个新的计算属性:contentViewController可用于所有UIViewControllers(和子类)。

我在下面发布的代码也适用于TabBarViewControllers。

当您尝试将导航控制器转换为ChatViewController时,segue.destinationController.contentViewController将以递归方式返回ChatViewController。

class LoginViewController: UIViewController {

    /* ... */

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if let chatVc = segue.destinationViewController.contentViewController as? ChatViewController {
            chatVc.senderId = userID
            chatVc.senderDisplayName = ""
        }
    }

}

extension UIViewController {

    var contentViewController: UIViewController {
        if let navcon = self as? UINavigationController {
            return navcon.visibleViewController ?? self
        } else if let tabcon = self as? UITabBarController {
            return tabcon.selectedViewController ?? self
        } else {
            return self
        }
    }

}

答案 2 :(得分:0)

执行此操作的一种简洁方法是在您登录后立即使用以下内容:

UPDATE table_a
    SET table_a.NAME = table_b.NAME
FROM table_a A, table_b B
WHERE A.ID = B.ID

您可以在此之后删除segue,并为tabbarcontroller设置storyboard id。

我喜欢这样做,因为它更自然。我的意思是UITabBarController主要是View Controller的父级,我不喜欢将UITabBarController设置为UIView Controller的子级。

也许没有任何问题,但我不喜欢它。

答案 3 :(得分:0)

这里。对我来说一切正常:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let tabVC = segue.destination as? UITabBarController {
        if let navVC = tabVC.viewControllers!.first as? UINavigationController {
            if let nextVC =  navVC.viewControllers.first as? NextVC {
                nextVC.varName = "works like a charm"
            }
        }
    }
}

NextVC是您要将变量发送到的目标VC。