我目前有这样的导航控制器设置:
和我的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控制器(为我的应用添加更多页面/功能)时,这样......
...并运行我的应用程序,我的程序在let navVc = segue.destinationViewController as! UINavigationController
行
我知道问题在于,在我的初始视图之后,它会转到标签栏UITabBarController
而不是UINavigationController
但是如果我更改它,我的数据不会转到视图我希望它去...它有点令人困惑。
如果您有任何想法如何实施,请告诉我,或者如果您有任何问题,请随时向我澄清。
谢谢!
P.S。我在控制台中收到的错误是:
Could not cast value of type 'UITabBarController' (0x10b8e48b0) to 'UINavigationController' (0x10b8e4860).
答案 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。