什么是用户定义运行时属性中的关键路径(Key Path)?

14

我继承了一个项目,对于某个关键字感到困惑。我的问题是,styleName关键字路径是什么?它是视图的属性吗?我该如何找到可用的关键字路径?

例如,在从storyboard中选择UILabel之后,我检查了身份检查器,在用户定义的运行时属性中看到了以下内容:

enter image description here

我尝试打开main-styles.plist文件,但不确定它与哪些文件链接在一起。

当我单击属性检查器(同时仍然突出显示storyboard中的UILabel)时,它看起来像这样:

enter image description here


如果您点击“属性检查器”(位于“标识检查器”的右侧),是否有“styleName”字段? - nhgrif
4个回答

25

有一个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,我们会看到这个:

enter image description here

我们现在有一个“边框颜色”属性,通过Attributes Inspector可以使用,否则通常不会出现。我指出这个工具的原因是,每当您通过Attributes Inspector设置这些属性之一时,您设置的值实际上作为这些“User Defined Runtime Attributes”之一存储:

enter image description here

每当从我的应用程序的XIB加载此视图时,首先发生的事情之一是将我的borderColor属性设置为我在Interface Builder中选择的此红色。

6
以下是可用属性类型及相应的属性类型列表。
 BooleanBOOL (true/false)
 NumberNSNumber * or any numeric scalar, e.g. NSInteger
 StringNSString 
 PointCGPoint
 SizeCGSize
 RectCGRect
 RangeNSRange
 ColorUIColor 

Here Image Show How Can You Define User Defined Runtime Attributes


4
基于 Apple文档

使用用户定义的运行时属性为没有界面构建器检查器的对象设置初始值。例如,如果您在身份检查器中为自定义视图添加以下条目:

The image of runtime attributes

自定义视图在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; 
}

0

谢谢 nhgrif。实际上,感谢你的答案,非常棒,所以加一,我找到了发生了什么。他们在 UIView 上创建了一个全局类别,名为 UIView+mystyle。在那里,他们有一个具有以下签名的方法:

- (void) setStyleName:(NSString*) styleName

所以Xcode在使用此方法时没有使用'set',并将其与运行时的键路径属性进行匹配。在这个方法中,他们应用了这个属性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接