Xcode 6快速多个segues准备segue

时间:2015-01-27 16:19:19

标签: ios iphone xcode swift ios8

我目前正在处理一个主要ViewController和另外两个ViewControllers的应用 一个是我的浏览器工作正常,另一个是TableView 我有5个Buttons引导我访问我的浏览器,其中一个应该转到我的TableView 我已将Button目前模态 segue关联到我的TableView控制器(已嵌入NavigationViewController)。
但每次我按下按钮时模拟器都会崩溃并出现此错误:

libswiftCore.dylib`swift_dynamicCastClassUnconditional:
0x10b9bf860:  pushq  %rbp
0x10b9bf861:  movq   %rsp, %rbp
0x10b9bf864:  testq  %rdi, %rdi
0x10b9bf867:  je     0x10b9bf89e               ; swift_dynamicCastClassUnconditional + 62
0x10b9bf869:  movabsq $-0x7fffffffffffffff, %rax
0x10b9bf873:  testq  %rax, %rdi
0x10b9bf876:  jne    0x10b9bf89e               ; swift_dynamicCastClassUnconditional + 62
0x10b9bf878:  leaq   0xb52e9(%rip), %rax
0x10b9bf87f:  movq   (%rax), %rax
0x10b9bf882:  andq   (%rdi), %rax
0x10b9bf885:  nopw   %cs:(%rax,%rax)
0x10b9bf890:  cmpq   %rsi, %rax
0x10b9bf893:  je     0x10b9bf8ad               ; swift_dynamicCastClassUnconditional + 77
0x10b9bf895:  movq   0x8(%rax), %rax
0x10b9bf899:  testq  %rax, %rax
0x10b9bf89c:  jne    0x10b9bf890               ; swift_dynamicCastClassUnconditional + 48
0x10b9bf89e:  leaq   0x36b7d(%rip), %rax       ; "Swift dynamic cast failed"
0x10b9bf8a5:  movq   %rax, 0xb4c0c(%rip)       ; gCRAnnotations + 8
0x10b9bf8ac:  int3   
0x10b9bf8ad:  movq   %rdi, %rax
0x10b9bf8b0:  popq   %rbp
0x10b9bf8b1:  retq   
0x10b9bf8b2:  nopw   %cs:(%rax,%rax)

如果我将segue连接到另一个viewcontroller或者我正在使用其他按钮,它将无法正常工作。

我知道问题出现在这段代码中,因为如果删除它,一切正常:

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


    var DestViewConroller : WebViewController = segue.destinationViewController as WebViewController



    if (segue.identifier == "homeSegue"){

        DestViewConroller.url = "https://edu.sh.ch"


    }

    if (segue.identifier == "mailSegue"){

        DestViewConroller.url = "https://edumail.sh.ch/owa"

    }

    if (segue.identifier == "mensaSegue"){

        DestViewConroller.url = "http://kanti.sh.ch/fileadmin/Redaktoren/Service/Mensa/Menueplan.pdf"

    }

    if (segue.identifier == "absenzenSegue"){

        DestViewConroller.url = "https://edu.sh.ch/Lists/Absenzen/Heute%20%20Knftige.aspx"

    }

    if (segue.identifier == "stundenplanSegue"){

        DestViewConroller.url = "https://edu.sh.ch/Informationen/Stundenplaene/SiteAssets/SitePages/Homepage/klassen_03_juli.pdf"


    }



}

提前致谢

4 个答案:

答案 0 :(得分:2)

错误日志提到

  

Swift动态演员失败

所以这意味着当swift尝试将segue.destinationViewController投射到WebViewController时会出现问题。

仅当destinationViewController不是WebViewController时才会发生这种情况。

当应用尝试转换为您提及的tableViewController时会发生什么。

因此,要修复此错误,您必须在每个if条件中初始化DestViewController或检查segue的标识符是否不是tableViewController的标识符,然后初始化并转换destinationViewController

答案 1 :(得分:1)

导航控制器可能是目的地,因此您必须执行以下操作:

var webViewController = (segue.destinationViewController as?
 UINavigationController)?.viewControllers[0] as? webViewController

答案 2 :(得分:1)

segue / dynamic cast failed 问题似乎突然出现,但很容易修复。

如果您的网页视图控制器嵌入UINavigationController,则segue.destinationViewControllerUINavigationController实例,而不是DestViewController实例。

您可能已经保留了导航控制器并替换了这一行:

var DestViewConroller : WebViewController = segue.destinationViewController as WebViewController

用这个:

var DestViewConroller : WebViewController = segue.destinationViewController.topViewController as WebViewController

.topViewController UINavigationController属性指的是导航堆栈的顶部,应该是您的DestViewConroller

答案 3 :(得分:0)

问题似乎出现在对象中。 确保您已在故事板中将DestViewConroller的类设置为WebViewController。如果不这样做,尽管存在强制转换,DestViewConroller仍将被假定为UIViewController的一个实例。