10

我刚刚安装了 XCode6 Beta-7,现在看到我的 PrepareForSegue 方法之一出现访问异常 - (当模态 Segue 即将展开时调用)

有问题的代码如下所示:

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


    if (segue.identifier == "MY_IDENTIFIER") { //EXC_BAD_ACCESS (code=1, address=0x0)
        //Never gets here...
    }


}

我尝试将 segue 参数设置为可选参数,但就 Swift 而言,segue它不是 nil,所以即使进行如下检查,我也会遇到同样的失败......

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

    if (segue != nil) 
       if (segue!.identifier == "MY_IDENTIFIER") { //EXC_BAD_ACCESS (code=1, address=0x0)
           //Never gets here...
       }
    }


}

应用程序中的所有其他 segues 似乎都可以正常工作,但是这个失败了 - 它似乎仅在发布 unwind 的情况下才会发生。其他人遇到过这个吗?

编辑/解决方法

一个简单的解决方法是避免使用 unwindSegue 方法并简单地调用dismissViewControllerAnimated,但我仍然很想知道为什么 unwindSegue 方法在这种情况下会失败......

非常感谢!

4

1 回答 1

14

正如 Matt Gibson 发现添加和删除 segue 标识符解决了这个问题。

该错误的原因是 Xcode 默认情况下不会为展开转场添加标识符。

情节提要中的默认展开转场如下所示:

<segue destination="foo" kind="unwind" unwindAction="unwind:" id="bar"/>

在 Objective-C 中,这不是问题,segue.identifier是零。在 Swiftidentifier中被声明为String,一个非可选的字符串。但是故事板中的标识符仍然是 nil,所以 SDK 在它表示它确实返回一个非可选字符串的地方返回 nil。这在运行时崩溃。

一旦您更改并删除了故事板中的标识符,该标识符将是""一个空字符串。

<segue destination="foo" kind="unwind" identifier="" unwindAction="unwind:" id="bar"/>

这当然可以解决问题,因为空字符串与identifiergetter 的指定返回值匹配。

我为此提交了雷达。你应该在Apples Bug Reporter中欺骗它

于 2014-09-14T23:35:20.000 回答