自动布局问题 Xcode 8 [_SwiftValue nsli_superitem]

Posted

技术标签:

【中文标题】自动布局问题 Xcode 8 [_SwiftValue nsli_superitem]【英文标题】:Autolayout issue Xcode 8 [_SwiftValue nsli_superitem] 【发布时间】:2016-09-15 21:19:00 【问题描述】:

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

自动布局有问题,日志显示如下:

[_SwiftValue nsli_superitem]: unrecognized selector sent to instance 

我该如何解决?谢谢

【问题讨论】:

【参考方案1】:

刚刚找到了奇怪但有效的解决方案:

不要这样做:

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))

我知道,这很奇怪,但它确实有效。 干杯

【讨论】:

感谢分享。对我来说,这是展开视图,这是一个可选的。所以let views = ["view":aView!] 至少你的转化了。我的项目升级完全忽略了我的所有限制。还原更改并连续重试 3 次。我的客户会喜欢我在获得他们想要更新的小功能之前完全重做他们的整个界面。 谢谢@martn_st,这对我有用。我的声明是@IBOutlet weak var aTableView: UITableView!,我认为这意味着它已经被打开了。我猜在 Swift 3 中,这还不够? 这里是解释:github.com/apple/swift-evolution/blob/master/proposals/… 我要花很长时间才能弄清楚这一点。感谢您的提问和回答。【参考方案2】:

在 swift 3 中,我们使用隐式解包选项的方式发生了变化。考虑以下示例:

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

因此,我们现在有[Int?],而不是预期的[Int] 类型的数组,这会导致上述运行时错误。


pascalbros 明确声明变量类型的解决方法解决了这个问题,但为了确定那里发生了什么,我建议检查可能的选项意外进入数组或字典并更改其推断类型。

【讨论】:

以上是关于自动布局问题 Xcode 8 [_SwiftValue nsli_superitem]的主要内容,如果未能解决你的问题,请参考以下文章

从 Xcode 8 转换为 Xcode 9 的项目的自动布局失败

无法正确地自动调整自动布局和堆栈视图(Swift 3、Xcode 8)

带有约束的滚动视图自动布局问题 xcode 8

自动布局不会在 iOS 8-Xcode 6 中立即更新帧

项目从Xcode 8转换为Xcode 9时自动布局失败

升级到 xcode 7 后的自动布局问题