在NSLayoutConstraint上设置运行时属性

Pau*_*son 4 cocoa interface-builder nslayoutconstraint

我想identifier在接口构建器中为我的一些约束设置属性.我User Defined Runtime Attributes之前在NSView实例中使用了IB中的表,并且没有遇到任何问题,但我无法使用约束类完成相同的操作.当我尝试在代码中访问标识符时,它只返回null,而不是我输入表的Value列的字符串.我想这可能与xib加载机制有关,但我希望有人能够肯定地说出问题是什么.

IB --> Identity Inspector --> User Defined Runtime Attributes:

  1. 关键路径:标识符
  2. 类型:字符串
  3. :TextViewWidthConstraint

稍后在一个IBAction方法中:

NSLog(@"%@", self.widthCon.identifier);

// --> (null)
Run Code Online (Sandbox Code Playgroud)

Luk*_*kas 5

NSLayoutConstraint实现似乎存在一些基本错误.在NSLayoutConstraint上创建一个类别并覆盖一些方法以进行调试,揭示了以下内容:

在编译期间,Xcode必须剥离运行时属性,原因如下:

  1. 被覆盖的KVC方法NSLayoutCategory内setValue:forKey:,setValue:forKeyPath:并且setValue:undefinedKey:永远不会获取调用.

  2. setIdentifier:调用覆盖的方法,但永远不会从运行时属性部分接收传递的值

  3. 提供无效密钥不会像在任何其他对象上那样创建错误,例如NSView:

    2014-03-19 08:25:52.806 LayoutTestApp [13733:303] [setValue:forUndefinedKey:]:此类不是密钥testKey的密钥值编码兼容.

此外,在Xcode上也可以优雅地忽略在NSLayoutConstraint上设置自定义类(自定义类的init方法永远不会被调用).看起来Apple禁用了NSLayoutConstraints的运行时属性和自定义类功能,或者它只是一个错误.无论哪种方式:通过运行时属性设置标识符很可能不会起作用.