我继承了一个项目,对于某个关键字感到困惑。我的问题是,styleName关键字路径是什么?它是视图的属性吗?我该如何找到可用的关键字路径?
例如,在从storyboard中选择UILabel之后,我检查了身份检查器,在用户定义的运行时属性中看到了以下内容:
我尝试打开main-styles.plist文件,但不确定它与哪些文件链接在一起。
当我单击属性检查器(同时仍然突出显示storyboard中的UILabel)时,它看起来像这样:
我继承了一个项目,对于某个关键字感到困惑。我的问题是,styleName关键字路径是什么?它是视图的属性吗?我该如何找到可用的关键字路径?
例如,在从storyboard中选择UILabel之后,我检查了身份检查器,在用户定义的运行时属性中看到了以下内容:
我尝试打开main-styles.plist文件,但不确定它与哪些文件链接在一起。
当我单击属性检查器(同时仍然突出显示storyboard中的UILabel)时,它看起来像这样:
有一个NSKeyValueCoding
协议,许多UIKit
中的对象符合此协议。
NSKeyValueCoding
中的一个方法是valueForKey:
(还有许多其他相关方法,请查看我链接的文档)。
通过在对象上调用valueForKey:
,我们可以在运行时访问在接口构建器上设置的属性。
例如,在此标签上,我可能会这样做:
Objective-C:
NSString *style = [myLabel valueForKey:@"styleName"];
Swift:
let style = myLabel.valueForKey("styleName")
现在我可以通过 Interface Builder 获取设置的值,并在运行时根据此处设置的值对标签执行某些操作。例如,在此处,我可能会使用特定的“样式名称”以特定方式设计标签。
如果您搜索项目中的 valueForKey
或 "styleName"
,您可能会发现此属性正在被使用以及它的确切用途。
关于我的属性检查器问题的后续,从 Xcode 6 开始,我们可以使用 @IBInspectable
属性创建属性,这些属性将显示在属性检查器中(如此所示)。考虑此 UIView
扩展:
extension UIView {
@IBInspectable var borderColor : UIColor? {
set (newValue) {
self.layer.borderColor = (newValue ?? UIColor.clearColor()).CGColor
}
get {
return UIColor(CGColor: self.layer.borderColor)
}
}
}
现在,如果我们查看storyboard中任何UIView
(或其子类)的Attributes inspector,我们会看到这个: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;
}
谢谢 nhgrif。实际上,感谢你的答案,非常棒,所以加一,我找到了发生了什么。他们在 UIView 上创建了一个全局类别,名为 UIView+mystyle。在那里,他们有一个具有以下签名的方法:
- (void) setStyleName:(NSString*) styleName