簡體   English   中英

什么是用戶定義的運行時屬性中的關鍵路徑?

[英]What is key Path in user defined runtime attributes?

我繼承了一個項目,我對某個鍵是什么感到困惑。 我的問題是, styleName鍵路徑是什么? 它是視圖的屬性嗎? 我怎樣才能找到可用的關鍵路徑?

例如,在我從故事板中選擇UILabel后,我檢查身份檢查器,並在用戶定義的運行時屬性中,我看到以下內容:

在此輸入圖像描述

我試過打開main-styles.plist文件但不確定它是如何鏈接在一起的。

當我點擊屬性檢查器(同時仍然保持故事板中的UILabel突出顯示)時,它是這樣的:

在此輸入圖像描述

有一個NSKeyValueCoding協議UIKit許多對象都符合NSKeyValueCoding協議

NSKeyValueCoding一個方法是valueForKey:以及許多其他相關方法,請查看我鏈接的文檔)。

通過在對象上調用valueForKey:我們可以在運行時訪問在接口構建器上設置的屬性。

所以,例如,在這個標簽上,我可能會這樣做:

Objective-C的:

NSString *style = [myLabel valueForKey:@"styleName"];

迅速:

let style = myLabel.valueForKey("styleName")

現在我可以通過Interface Builder獲取設置值,在運行時,我可以根據此處設置的值對標簽執行某些操作。 例如,在這里,我可能會使用特定的“樣式名稱”以特定方式設計標簽。

如果您在項目中搜索valueForKey"styleName" ,您可能會發現此屬性的使用位置以及正在使用的屬性。


為了跟進我關於屬性檢查器的問題,從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檢查器,我們將看到:

在此輸入圖像描述

我們現在通過屬性檢查器提供“邊框顏色”屬性,該屬性通常不存在。 我指出這個工具的原因是因為無論何時通過Attributes Inspector設置其中一個屬性,您設置的值實際上存儲為這些“用戶定義的運行時屬性”之一:

在此輸入圖像描述

每當從我的應用程序中的XIB加載此視圖時,首先發生的事情之一就是我的borderColor屬性將設置為我在Interface Builder中選擇的這種紅色。

下面是可用屬性類型和相應屬性類型的列表。

 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 

此處圖像顯示如何定義用戶定義的運行時屬性

基於Apple doc

使用用戶定義的運行時屬性為沒有接口構建器檢查器的對象設置初始值。 例如,如果在身份檢查器中為自定義視圖添加以下條目:

運行時屬性的圖像

加載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

因此xcode使用此方法而不使用'set'並將其與運行時鍵路徑屬性相匹配。 在這種方法中,他們正在應用該屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM