我继承了一个项目,我对某个键是什么感到困惑。 我的问题是,什么是 styleName 键路径?它是视图的属性吗?我怎样才能找到可用的关键路径?
例如,在我从故事板中选择UILabel后,我检查身份检查器,并在用户定义的运行时属性中看到以下内容:
我尝试打开main-styles.plist文件但不确定它是如何链接在一起的。
当我点击属性检查器(同时仍然保持故事板中的UILabel突出显示)时,这就是它的样子:
答案 0 :(得分:23)
有一个NSKeyValueCoding
protocol,UIKit
中的许多对象符合这些内容。
NSKeyValueCoding
中的一个方法是valueForKey:
(以及许多其他相关方法,请查看我链接的文档)。
通过在对象上调用valueForKey:
,我们可以在运行时访问在界面构建器上设置的属性。
所以,例如,在这个标签上,我可能会这样做:
目标C:
NSString *style = [myLabel valueForKey:@"styleName"];
夫特:
let style = myLabel.valueForKey("styleName")
现在我可以通过Interface Builder获取设置值,在运行时,我可以根据此处设置的值对标签执行某些操作。例如,在这里,我可能会使用特定的“样式名称”以特定方式设计标签。
如果您在项目中搜索valueForKey
或"styleName"
,则可能会找到此属性的使用位置以及正在使用的内容。
要跟进我关于属性检查器的问题,从Xcode 6开始,我们可以使用@IBInspectable
属性创建将在属性检查器(as seen here)中显示的属性。考虑这个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检查器,我们会看到:
我们现在通过属性检查器提供了“边框颜色”属性,该属性通常不存在。我指出这个工具的原因是因为每当你通过Attributes Inspector设置其中一个属性时,你设置的值实际上存储为这些“用户定义的运行时属性”之一:
每当从我的应用程序中的XIB加载此视图时,首先要做的事情之一就是我的borderColor
属性将设置为我在Interface Builder中选择的这种红色。 / p>
答案 1 :(得分:4)
以下是可用属性类型和相应属性类型的列表。
Boolean – BOOL (true/false)
Number – NSNumber * or any numeric scalar, e.g. NSInteger
String – NSString
Point – CGPoint
Size – CGSize
Rect – CGRect
Range – NSRange
Color – UIColor
答案 2 :(得分:3)
使用用户定义的运行时属性为没有界面构建器检查器的对象设置初始值。例如,如果在身份检查器中为自定义视图添加以下条目:
自定义视图将在加载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;
}
答案 3 :(得分:0)
感谢nhgrif。实际上多亏了你的答案,这很好,加上一个我发现了什么。他们在UIView上创建了一个全球类别。它叫做UIView + mystyle。他们有一个带有以下签名的方法:
- (void) setStyleName:(NSString*) styleName
因此xcode使用此方法时没有设置'并将其与运行时密钥路径属性相匹配。在这种方法中,他们正在应用该属性。