准备 Segue 到 UITabBarController 选项卡

Posted

技术标签:

【中文标题】准备 Segue 到 UITabBarController 选项卡【英文标题】:Prepare for Segue to UITabBarController Tab 【发布时间】:2015-04-11 00:44:22 【问题描述】:

我想将信息从ViewController 传递到UITabBarController,以便我可以从UITabBarController 的第三个选项卡中的视图控制器访问某些信息。

但是,问题是当我尝试这样做时,我的程序不断崩溃。到目前为止,这是我的代码:

我这样称呼segue:

self.firstName = user.first_name
self.lastName = user.last_name
self.performSegueWithIdentifier("OffersView", sender: self)

我重写了prepareForSegue 函数,这样我就可以像这样在这个函数中传递信息:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    if(segue.identifier == "OffersView")
        let barViewControllers = segue.destinationViewController as UITabBarController
        let destinationViewController = barViewControllers.viewControllers![2] as ProfileController
        destinationViewController.firstName = self.firstName
        destinationViewController.lastName = self.lastName
    

当我尝试设置destinationViewController(在上面代码的第二行)时,我的代码崩溃了。我不知道为什么,因为我查看了许多 *** 帖子,例如

Swift tab bar view prepareforsegue 和 Pass data from tableview to tab bar view controller in Swift. 但都没有太大的成功。我是否可能需要创建一个UITabBarControllerDelegate 类并通过它传递信息?任何提示将不胜感激。谢谢!

【问题讨论】:

它崩溃并显示什么错误消息? @rdelmar 它似乎没有显示任何特定的错误消息。 在测试应用程序中,将两个“as”单词更改为“as!”后,您的代码对我来说运行良好在prepareForSegue中。 你能举个例子说明你是怎么做到的吗?我在“as”字前添加了一个感叹号,但我收到一条错误消息,提示“As 之后的预期类型”@rdelmar 它在 as, as! 之后,而不是之前。 【参考方案1】:

经过讨论发现,问题在于标签栏控制器的子级嵌入在导航控制器中,因此需要将代码更改为这样,

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)  
    let barViewControllers = segue.destinationViewController as! UITabBarController 
    let nav = barViewControllers.viewControllers![2] as! UINavigationController 
    let destinationViewController = nav.topviewcontroller as ProfileController 
    destinationViewController.firstName = self.firstName
    destinationViewController.lastName = self.lastName 

【讨论】:

【参考方案2】:

在 swift 3 中,xcode 8 中的代码会是这样的

let barViewControllers = segue.destination as! UITabBarController
let nav = barViewControllers.viewControllers![0] as! UINavigationController
let destinationViewController = nav.viewControllers[0] as! YourViewController
        destinationViewController.varTest = _varValue

【讨论】:

如何找出选择了哪个选项卡并为该特定选项卡视图设置变量? 就我而言,我需要导航到“YourViewController”。我的猜测是在 viewControllers 数组中存储了所有控制器(我是 swift 新手)。【参考方案3】:

Swift 4 没有强制可选解包的解决方案

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    if let barVC = segue.destination as? UITabBarController 
        barVC.viewControllers?.forEach 
            if let vc = $0 as? YourViewController 
                vc.firstName = self.firstName
                vc.lastName = self.lastName
            
        
    

【讨论】:

以上是关于准备 Segue 到 UITabBarController 选项卡的主要内容,如果未能解决你的问题,请参考以下文章

准备 segue 传递数据 nil

准备使用数组进行 Segue - Xcode 8.0 Swift 3.0

准备 segue 数组时不包含数据(使用 swift)

为 segue 做准备没有按预期工作

在 Swift 中为嵌入式 tableView 中的 segue 做准备

如何准备 segue 在我的 TableViewController 中加载不同的数组?