ios - 界面 View : addConstraint fails with EXC_BAD_INSTRUCTION unless no-op constraints() is called first

标签 ios xcode swift autolayout

我有一个布局需要从模型的(间接)数据更新乘数。简而言之,我可以删除约束并从中创建修改后的约束。但是,当我尝试通过 addConstraint(...) 再次添加约束时,我得到了名义上的 EXC_BAD_INSTRUCTION 错误。

奇怪的是,当我添加调试代码来检查现有约束时,问题就消失了。除了另一个 iOS/Swift 错误之外,是否有任何可能的解释这个问题?

我的代码看起来(类似)如下:

    myView?.constraints() // crashes without this line, only works with it
    myView?.removeConstraint(self.myConstraint)
    self.myConstraint = myConstraint.withMultiplier(someModelDoubleValue / 14.0)
    myView?.addConstraint(self.myConstraint) // crashes here without first line

有没有其他人这样做过 - 这看起来微不足道,我无法想象它不会被测试。

请注意,withMultiplier 方法只是我的功能性扩展方法,但它已经过测试并且可以正常工作。不过,为了全面披露,它看起来像这样:

extension NSLayoutConstraint {
    func withMultiplier(newMultiplier:CGFloat) -> NSLayoutConstraint {
        return NSLayoutConstraint(
            item: firstItem, attribute: firstAttribute,
            relatedBy: relation,
            toItem: secondItem, attribute: secondAttribute,
            multiplier: newMultiplier, constant: constant)
    }
}

最佳答案

我相信您的 self.myConstraint 是一个带有“隐式解包选项”的 weak 引用,例如:

@IBOutlet weak var myConstraint: NSLayoutConstraint!

它在 myView?.removeConstraint(self.myConstraint) 处被释放。然后,在 myConstraint.withMultiplier(myConstraintnil,这会导致错误。

如果是这样,只需省略 weak 或使用临时变量,如:

var constraint = self.myConstraint
myView?.removeConstraint(constraint)
constraint = constraint.withMultiplier(someModelDoubleValue / 14.0)
myView?.addConstraint(constraint)
self.myConstraint = constraint

为什么 myView?.constraints() 解决了这个问题?也就是说,constraints() 返回带有 autorelease()NSArray。该数组具有对约束的强引用,并且存在于当前的自动释放池中。

关于ios - 界面 View : addConstraint fails with EXC_BAD_INSTRUCTION unless no-op constraints() is called first,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26374928/

相关文章:

ios - UIButton 旋转后失去目标

objective-c - UIKit 中图像与自定义绘图的性能

ios - 我们可以检测哪个 ios 应用程序正在使用我的自定义键盘吗

ios - 无法从 Twitter 登录获取电子邮件

ios - 'FIRAppNotConfigured',原因 : 'Failed to get default Firebase Database instance. Must call ` [FIRApp configure ]` (` FirebaseApp. configure()`(Swift 中)

ios - 替换 iOS ALAssetsLibrary 中的 ALAsset 对象

xcode - 如何在Xcode 6中获取10.8 SDK和5.1编译器

ios - 页面 View ScrollView 不是锻炼

swift - 编译器选择了错误的初始化程序

objective-c - 关于将 Objective C 代码添加到快速动态框架的说明