2016-09-15 92 views
21

将我的代码转换为Swift 3我发现了一个奇怪的问题。 现在(2016年9月15日)Xcode 8(公开版)已经出来,在转换代码之后,我的应用程序崩溃了,没有明显的原因。Autolayout问题Xcode 8 [_SwiftValue nsli_superitem]

也有一些是错误的自动布局和日志说是这样的:

[_SwiftValue nsli_superitem]: unrecognized selector sent to instance 

我怎样才能解决?由于

回答

37

只是想出出怪异,但工作的解决方案:

而不是这样做:

let views = ["view":aView] 
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "...", options:[], metrics: metrics, views: views)) 

声明明确字典:

let views: [String:UIView] = ["view":aView] 
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "...", options:[], metrics: metrics, views: views)) 

我知道,这是奇怪,但它的工作原理。 Cheers

+9

感谢您分享此内容。对我来说,这是一个可选的视角,这是展开的。所以'让视图= [“视图”:aView!]' –

+0

至少你转换。我的项目升级完全忽略了我所有的限制。恢复更改并连续重试3次。我的客户只是想要在完成他们想要更新的小功能之前完全重做他们的整个界面。 – DiggyJohn

+0

感谢@martn_st,这就是我的工作。我的声明是'@IBOutlet弱var aTableView:UITableView!',我认为这意味着它已经被解开。我猜在Swift 3中,这还不够? – Bek

2

在swift 3中,我们使用隐式解包的option选项的方式已经改变。考虑下面的例子:

let optionalInt: Int! = 1 
let int = optionalInt 
let array = [int, 2] 
print(array) // prints: [Optional(1), Optional(2)] 

所以代替具有[Int]类型如预期的阵列,我们现在有[Int?],这会导致上述的运行时错误。


pascalbros的解决方法,以显式声明变量的类型解决了这个问题,但会发生什么也可以肯定的,我建议你意外地检查可能的自选进入一个数组或词典改变其推断类型。