web-dev-qa-db-ja.com

ユーザー定義のランタイム属性のキーパスとは何ですか?

私はプロジェクトを継承しましたが、特定のキーが何であるか混乱しています。私の質問は、styleNameキーパスとは何ですか?ビューのプロパティですか?利用可能な主要なパスを見つけるにはどうすればよいですか?

たとえば、ストーリーボードからUILabelを選択した後、IDインスペクターをチェックし、ユーザー定義のランタイム属性で次のように表示します。

enter image description here

Main-styles.plistファイルを開こうとしましたが、どのようにリンクされているのかわかりません。

属性インスペクターをクリックすると(ストーリーボードのUILabelを強調表示したまま)、次のようになります。

enter image description here

12
j2emanue

NSKeyValueCoding protocol があり、UIKit内の多くのオブジェクトが準拠しています。

NSKeyValueCoding内のメソッドの1つは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)
        }
    }
}

ストーリーボードのUIView(またはサブクラス)の属性インスペクターを見ると、次のようになっています。

enter image description here

これで、通常は存在しない属性インスペクターを介して「境界線カラー」プロパティを利用できるようになりました。このツールを指摘する理由は、属性インスペクターを使用してこれらのプロパティのいずれかを設定すると、設定した値が実際にはこれらの「ユーザー定義ランタイム属性」の1つとして保存されるためです。

enter image description here

そして、このビューがアプリのXIBから読み込まれるときは常に、最初に起こることの1つは、borderColorプロパティが、インターフェイスビルダーで選択したこの赤い色に設定されることです。

23
nhgrif

以下は、使用可能な属性タイプと対応するプロパティタイプのリストです

 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 

Here Image Show How Can You Define User Defined Runtime Attributes

4

Apple doc に基づく

ユーザー定義のランタイム属性を使用して、インターフェイスビルダーインスペクターを持たないオブジェクトの初期値を設定します。たとえば、カスタムビューのIDインスペクターに次のエントリを追加するとします。

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; 
}
_
3
AechoLiu

nhgrifに感謝します。実際にあなたの答えに感謝しました。とても素晴らしかったので、私は何が起こっているのかを見つけました。彼らは、UIViewにグローバルカテゴリを作成しました。その呼び出されたUIView + mystyle。そこでは、次のシグネチャを持つメソッドがあります。

- (void) setStyleName:(NSString*) styleName

したがって、xcodeは「set」なしでこのメソッドを使用し、ランタイムキーパス属性と照合します。この方法では、属性を適用しています。

0
j2emanue