在 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 设置动画?