我有一个布局,需要从模型的(间接)数据更新乘数。简而言之,我可以删除约束并从中创建一个修改的约束。不过,当我试图通过add constraint(…)再次添加约束时,会出现名义的EXC_BAD_指令错误。
奇怪的是,当我添加调试代码来检查现有的约束时,问题就消失了。除了另一个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)处出售。然后,atmyConstraint.withMultiplier(myConstraint是导致错误的nil
如果是,请省略weak或使用以下临时变量:
var constraint = self.myConstraint
myView?.removeConstraint(constraint)
constraint = constraint.withMultiplier(someModelDoubleValue / 14.0)
myView?.addConstraint(constraint)
self.myConstraint = constraint

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

关于ios - UIView:addConstraint失败并显示EXC_BAD_INSTRUCTION,除非首先调用no-op Constraints(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26374928/

10-13 09:04