【问题标题】:Autolayout issue Xcode 8 [_SwiftValue nsli_superitem]自动布局问题 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 

我该如何解决?谢谢

【问题讨论】:

    标签: ios swift xcode swift3


    【解决方案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 中,这还不够?
    • 我要花很长时间才能弄清楚这一点。感谢您的提问和回答。
    【解决方案2】:

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

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

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


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-11
      • 1970-01-01
      • 2017-01-30
      • 1970-01-01
      • 2017-03-15
      • 2015-12-09
      相关资源
      最近更新 更多