在 NSLayoutConstraint 上设置运行时属性

Posted

技术标签:

【中文标题】在 NSLayoutConstraint 上设置运行时属性【英文标题】:Setting runtime attributes on NSLayoutConstraint 【发布时间】:2014-03-11 09:13:39 【问题描述】:

我想在界面生成器中为我的一些约束设置identifier 属性。我之前在 IB 中使用过 User Defined Runtime Attributes 表和 NSView 实例,并且没有遇到任何问题,但是我在约束类上做同样的事情却无处可去。当我尝试访问代码中的标识符时,它只返回 null,而不是我在表的 Value 列中输入的字符串。我想这可能与 xib 加载机制有关,但我希望有人能够确定问题所在。

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

    密钥路径:标识符 类型:字符串 :TextViewWidthConstraint

稍后在IBAction 方法中:

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

// --> (null)

【问题讨论】:

【参考方案1】:

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

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

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

    被覆盖的方法 setIdentifier: 被调用,但从未从运行时属性部分接收传递的值

    提供无效键不会像在任何其他对象(例如 NSView)上一样产生错误:

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

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

【讨论】:

您好 Lukas,感谢您对此进行调查。我会通知相关的苹果部门。到你的帖子,希望他们能告诉我们你描述的行为是故意的还是错误的【参考方案2】:

您的问题可能是,NSLayoutConstraint 类没有属性 identifier,试试这个:

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

【讨论】:

虽然 NSLayoutConstraint 的 ios 实现上没有 identifier 属性,但 OS X 实现在 10.9 版本(小牛)中增加了一个。

以上是关于在 NSLayoutConstraint 上设置运行时属性的主要内容,如果未能解决你的问题,请参考以下文章

根据视图的高度或屏幕高度设置 NSLayoutConstraint 常量

如何在 Swift 中为 NSLayoutConstraint 设置动画?

使用 NSLayoutConstraint 实例化和设置 UIButton 子类的大小

NSLayoutConstraint 设置优先级

NSLayoutConstraint 设置

NSLayoutConstraint - 无法将子视图框架设置为父视图边界