【问题标题】:Swift - Unwind Segue triggering errorSwift - Unwind Segue 触发错误
【发布时间】:2016-01-11 03:36:55
【问题描述】:

我第一次使用 Unwind Segue 方法。我有多个视图控制器,如下图所示(其中一些当然显示)。在编辑配置文件中,我有一个完成按钮。单击后,我会触发一个 IBAction,该 IBAction 会触发 unwind segue。

这是导航栏中完成按钮的代码:

@IBAction func unwindToMainViews(sender: UIStoryboardSegue) {
    //let sourceViewController = sender.sourceViewController
    self.performSegueWithIdentifier("unwindToMainSegue", sender: self)        
}

并且在

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) 

我正在执行以下操作以将数据从编辑配置文件传递回主视图

if (segue.identifier == "unwindToMainSegue") {
    // pass data to next view
    let tabCtrl = segue.destinationViewController as! UITabBarController
    let destinationVC = tabCtrl.viewControllers![0] as! HomeViewController
            destinationVC.userObject = self.userObject;
}

当segue标识符匹配并执行代码(将userObject从这个控制器转移到另一个)时,它会触发错误:

无法将“app.EditProfileViewController”(0x100b99d80)类型的值转换为“UITabBarController”(0x104a1d030)。

如何解决此错误?我很惊讶,因为我正在向 UITabBarController 投射,所以认为它应该可以工作。

【问题讨论】:

  • 抱歉,我不明白您的建议
  • 你不返回UITabBarController,你返回触发原始segue的ViewController。
  • 好的...因为我是 unwinding 的新手...你能告诉我如何修改它以返回触发原始 segue 的视图控制器吗?

标签: ios xcode swift


【解决方案1】:

您不会在展开转场中返回到 UITabBarController。您返回到触发原始 segue 的 ViewController,或者如果它的祖先则返回。

正如@jlehr 在 cmets 中所说:

放松转场不会返回任何东西;他们驳回任何推动和 在源视图和目标视图之间呈现视图控制器 控制器。目的地是执行的地方 unwind 方法找到了,不管源视图控制器如何 已提交。

要展开到触发原始segue的viewController,您需要在要返回的viewController中实现@IBAction func returnToHere(segue: UIStoryboardSegue)函数。

然后,当您通过拖动到 退出 图标来设置 完成 按钮时,从弹出窗口中选择 returnToHere

要将数据传回 sourceViewController,请为您的 unwind segue 提供一个标识符,例如“unwindToSource”,然后在您返回的 viewController 中覆盖 prepareForSegue

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "unwindToSource" {
        let dvc = segue.destinationViewController as! SourceViewController
        dvc.userObject = self.userObject
    }
}

【讨论】:

  • 好的...这与我采取的方法不同,这可能是错误的原因。但是你能解释一下我如何使用你的方法将数据传回源视图控制器吗?
  • 我进行了更改并进行了测试……它实际上自动更新了数据。在我看来,这是一种奇怪的行为。但我想这就是它的工作原理。谢谢
  • 说“您返回到触发原始 segue 的 ViewController”具有误导性。 Unwind segues 不会返回任何东西;他们关闭源视图控制器和目标视图控制器之间的任何推送和呈现的视图控制器。无论源视图控制器是如何呈现的,目标都是找到 unwind 方法的实现的地方。
  • @jlehr,这是正确的。我正在解决他们认为展开的目的地是 UITabBarController 的实现。您绝对正确,unwind 可以删除源和目标之间的多个视图控制器,并且目标是找到 unwind 方法的任何位置。它当然必须在调用链中。
  • @jlehr,感谢您指出我的语言具有误导性。我将您的评论纳入我的回答中,因为它已经非常清楚地说明了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 2016-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多