13

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

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

ここに画像の説明を入力

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

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

ここに画像の説明を入力

4

4 に答える 4

25

内部のオブジェクトの多くが準拠するNSKeyValueCodingプロトコルがありますUIKit

内のメソッドの 1 つNSKeyValueCodingですvalueForKey:(および他の多くの関連するメソッドについては、リンクしたドキュメントを確認してください)。

オブジェクトを呼び出すvalueForKey:ことで、実行時にインターフェイス ビルダーで設定されたプロパティにアクセスできます。

したがって、たとえば、このラベルでは、次のようなことを行う場合があります。

目的 C:

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

迅速:

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ストーリーボードの任意の (またはサブクラス)の属性インスペクターを見ると、次のように表示されます。

ここに画像の説明を入力

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

ここに画像の説明を入力

そして、このビューがアプリの XIB からロードされるたびに、最初に発生することの 1 つはborderColor、Interface Builder で選択したこの赤い色にプロパティが設定されることです。

于 2015-05-06T23:22:45.450 に答える
4

Apple docに基づく

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

ランタイム属性のイメージ

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; 
}
于 2015-10-05T03:43:57.247 に答える