我继承了一个项目,我对某个键是什么感到困惑。我的问题是,styleName键 Path 是什么?它是视图的属性吗?我怎样才能找出可用的关键路径?
例如,在我从情节提要中选择 UILabel 后,我检查身份检查器,在用户定义的运行时属性中,我看到以下内容:
我试过打开 main-styles.plist 文件,但不确定它是如何链接在一起的。
当我单击属性检查器时(同时仍使情节提要中的 UILabel 突出显示),这就是它的样子:
我继承了一个项目,我对某个键是什么感到困惑。我的问题是,styleName键 Path 是什么?它是视图的属性吗?我怎样才能找出可用的关键路径?
例如,在我从情节提要中选择 UILabel 后,我检查身份检查器,在用户定义的运行时属性中,我看到以下内容:
我试过打开 main-styles.plist 文件,但不确定它是如何链接在一起的。
当我单击属性检查器时(同时仍使情节提要中的 UILabel 突出显示),这就是它的样子:
有一个NSKeyValueCoding
协议,其中的许多对象都UIKit
符合该协议。
其中一种方法NSKeyValueCoding
是valueForKey:
(以及许多其他相关方法,请查看我链接的文档)。
通过调用valueForKey:
一个对象,我们可以在运行时访问在界面构建器上设置的属性。
所以,例如,在这个标签上,我可能会做这样的事情:
目标-C:
NSString *style = [myLabel valueForKey:@"styleName"];
迅速:
let style = myLabel.valueForKey("styleName")
现在我可以通过 Interface Builder 获取设置的值,并且在运行时,我可以根据此处设置的值对标签做一些事情。例如,在这里,我可能会使用特定的“样式名称”来以特定的方式设计标签。
如果您在项目中搜索valueForKey
or "styleName"
,您可能会发现该属性在哪里被使用,以及它究竟做了什么。
为了跟进我关于 Attribute Inspector 的问题,从 Xcode 6 开始,我们可以使用该@IBInspectable
属性来创建将显示在 Attributes Inspector 中的属性(如此处所示)。考虑这个UIView
扩展:
extension UIView {
@IBInspectable var borderColor : UIColor? {
set (newValue) {
self.layer.borderColor = (newValue ?? UIColor.clearColor()).CGColor
}
get {
return UIColor(CGColor: self.layer.borderColor)
}
}
}
现在,如果我们查看情节提要中任何(或子类)的属性检查器UIView
,我们将看到:
我们现在可以通过 Attributes Inspector 获得一个“Border Color”属性,该属性通常不存在。我指出这个工具的原因是因为每当您通过属性检查器设置这些属性之一时,您设置的值实际上存储为这些“用户定义的运行时属性”之一:
每当在我的应用程序中从 XIB 加载此视图时,首先会发生的事情之一就是我的borderColor
属性将设置为我在 Interface Builder 中选择的红色。
基于苹果文档
使用用户定义的运行时属性为没有界面构建器检查器的对象设置初始值。例如,如果您在自定义视图的身份检查器中添加以下条目:
加载 nib 时,自定义视图将收到此消息:
[customView setValue:[NSNumber numberWithBoolean:NO] forKeyPath:@"isDataLoaded"];
[customView setValue:@"Hatha" forKeyPath:@"excersize.yoga"];
[customView setValue:nil forKeyPath:@"myData"];
重要提示:用户定义的运行时属性的属性或键路径必须存在于对象中,否则将发生异常。
因为这些方法是在nib
加载时调用的。所以,那些运行时属性可以在-(void)awakeFromNib
.
例如,
- (void)awakeFromNib
{
// @property (nonatomic) BOOL isDataLoaded, which is assigned by the above `User Defined Runtime Attributes` picture.
BOOL isLoaded = self.isDataLoaded;
}
谢谢恩格里夫。实际上,多亏了您的回答,这很棒,所以加上一个,我发现了正在发生的事情。他们在 UIView 上创建了一个全局类别。它被称为 UIView+mystyle。他们有一个具有以下签名的方法:
- (void) setStyleName:(NSString*) styleName
所以 xcode 使用这个方法没有'set'并将其与运行时键路径属性相匹配。在这种方法中,他们正在应用该属性。