Swift:PrepareForSegue,Swift Cast失败

时间:2014-08-20 13:41:54

标签: ios xcode uitableview swift

我想在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; "斯威夫特动态演员失败"   0x103f1f5e5:movq%rax,0xa456c(%rip); gCRAnnotations + 8   0x103f1f5ec:int3
  0x103f1f5ed:movq%r14,%rax

有什么问题?

5 个答案:

答案 0 :(得分:2)

可能会在游戏中迟到,但却遇到了完全相同的问题。 这里的问题是你的Segue指向Tab控制器而不是它需要跳转到的实际ViewController。我指的是你提供给Antonio的第二张截图。如果您确定它应该可以正常工作。

答案 1 :(得分: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)")
    }
}

这当然有效。但是如果你有多个segues和多个viewController,摆动信息和数据可能会非常麻烦。

考虑协议方法:

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

答案 2 :(得分:1)

我遇到了类似的错误 - 我相信segue.destinationViewController在这里是UINavigationController。您收到错误是因为您正在尝试将UINavigationController转换为FirstViewController类。

更改此行:let vc = segue.destinationViewController as FirstViewController

let vc = segue.destinationViewController.topViewController as FirstViewController

.topViewController是导航堆栈上的顶层视图控制器 - 现在应该是FirstViewController的实例

答案 3 :(得分:0)

检查你的故事板,我认为你做了segue"指向"到另一个viewController错误。

答案 4 :(得分: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。