在NSLayoutConstraint上设置运行时属性

时间:2014-03-11 09:13:39

标签: cocoa interface-builder nslayoutconstraint

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

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

  1. 密钥路径:标识符
  2. 输入:字符串
  3. :TextViewWidthConstraint
  4. 稍后使用IBAction方法:

    NSLog(@"%@", self.widthCon.identifier);
    
    // --> (null)
    

2 个答案:

答案 0 :(得分:5)

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

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

  1. NSLayoutCategory setValue:forKey:setValue:forKeyPath:setValue:undefinedKey:内覆盖的KVC方法永远不会被调用。

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

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

    2014-03-19 08:25:52.806 LayoutTestApp [13733:303] [setValue:forUndefinedKey:]:此类与密钥testKey不符合密钥值编码。

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

答案 1 :(得分:-1)

您的问题可能是,NSLayoutConstraint类没有属性identifier,请尝试以下操作:

NSLog(@"%@", [self.widthCon valueForKey:@"identifier"]);