Swift: PrepareForSegue, Swift Cast failure

3
我希望在我的 TableViewController 中选择一个单元格。 单元格的文本应通过segue传递到FirstViewController的标签上。 我总是得到下面显示的错误。
标识符是正确的。
我的代码:
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
    if (segue.identifier == "BackToCalculator") {
        //let myRow = tableView.indexPathForSelectedRow().row+1
        let vc = segue.destinationViewController as FirstViewController
        vc.SelectedBundesland.text = "Test"
    }
}

异常:

0x103f1f5dc: jne 0x103f1f5d0 ; swift_dynamicCastClassUnconditional + 48 0x103f1f5de: leaq 0x3364d(%rip), %rax ; "Swift dynamic cast failed" 0x103f1f5e5: movq %rax, 0xa456c(%rip) ; gCRAnnotations + 8 0x103f1f5ec: int3
0x103f1f5ed: movq %r14, %rax

问题出在哪里?


1
可能问题在于目标视图控制器不是 FirstViewController 的实例 - 你检查了吗?哪一行引发了异常? - Antonio
你能告诉我如何实现DestinationViewController是FirstViewController的一个实例吗?我对Swift还很陌生。先谢谢了。 - Velocity
这更多关于iOS开发,而不是Swift本身——我猜你甚至不知道如何使用Objective-C实现它。因此,我建议您阅读一些文档,并阅读一些教程,例如这个,以及在raywenderlich网站上提供的其他教程——或者直接谷歌。 - Antonio
link - Velocity
当我直接将segue连接到FirstViewController时,行let vc = segue.destinationViewController as FirstViewController可以工作,并且vc是FirstViewController的一个对象。但是下一行vc.SelectedBundesland.text = "Test"不起作用:致命错误:在解包可选值时意外发现nil。 - Velocity
显示剩余7条评论
5个回答

2
可能来晚了,但我遇到了完全相同的问题。 问题在于你的 Segue 指向 Tab 控制器,而不是实际需要跳转的 ViewController。我指的是你提供给 Antonio 的第二张截图。如果你修复它,应该就能正常工作了。

2
一种更安全和前瞻的方法是条件类型转换,甚至更好的基于协议的方法,请考虑以下内容:
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
    if let vc = segue.destinationViewController as? FirstViewController {
        vc.SelectedBundesland.text = "Test"
    } else {
       print("Some other controller! \(segue.destinationViewController)")
    }
}

那当然可以。但是如果您有多个转场和多个视图控制器,传递信息和数据可能会非常麻烦。考虑使用协议的方法:
protocol BundeslandProtocol {
    var SelectedBundesland: String {get set}
}

override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
    if var vc = segue.destinationViewController as? BundeslandProtocol {
        vc.SelectedBundesland.text = "Test"
    }
}

要使上述工作正常,您只需声明您的UIViewController符合该协议:
class AwesomeViewController: UIViewController, BundeslandProtocol {
 .... 
}

随着时间的推移,您将能够重命名您的类、更改它们、替换和扩展您的项目,而无需关心更改引用,只要协议保持其目的即可。
很难确定您的代码出了什么问题:通常情况下,当您在故事板中忘记设置您的类名(在您的情况下是FirstViewController)时,这种情况就会发生,对于执行segue的控制器,请参见截图,必须设置它,而不是UIViewController通用类。

see screenshot


1
我曾经遇到过类似的错误 - 我认为这里的 segue.destinationViewController 是一个 UINavigationController。你之所以会出现错误,是因为你试图将 UINavigationController 强制转换为 FirstViewController 类。
更改此行:let vc = segue.destinationViewController as FirstViewController 为:let vc = segue.destinationViewController.topViewController as FirstViewController .topViewController 是导航堆栈上的顶层视图控制器 - 现在应该是 FirstViewController 的实例。

0

试一下这个,

self.performSegueWithIdentifier("BackToCalculator", sender: self)

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

    if (segue.identifier == "BackToCalculator") {
        //let myRow = tableView.indexPathForSelectedRow().row+1
        let vc = segue.destinationViewController as FirstViewController
        vc.SelectedBundesland.text = "Test"
}

你需要调用self.performSegueWithIdentifier。


0

请检查您的故事板,我认为您错误地将segue“指向”另一个视图控制器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接