私はプロジェクトを継承しましたが、特定のキーが何であるか混乱しています。私の質問は、styleNameキーパスとは何ですか?ビューのプロパティですか?利用可能な主要なパスを見つけるにはどうすればよいですか?
たとえば、ストーリーボードからUILabelを選択した後、IDインスペクターをチェックし、ユーザー定義のランタイム属性で次のように表示します。
Main-styles.plistファイルを開こうとしましたが、どのようにリンクされているのかわかりません。
属性インスペクターをクリックすると(ストーリーボードのUILabelを強調表示したまま)、次のようになります。
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
(またはサブクラス)の属性インスペクターを見ると、次のようになっています。
これで、通常は存在しない属性インスペクターを介して「境界線カラー」プロパティを利用できるようになりました。このツールを指摘する理由は、属性インスペクターを使用してこれらのプロパティのいずれかを設定すると、設定した値が実際にはこれらの「ユーザー定義ランタイム属性」の1つとして保存されるためです。
そして、このビューがアプリのXIBから読み込まれるときは常に、最初に起こることの1つは、borderColor
プロパティが、インターフェイスビルダーで選択したこの赤い色に設定されることです。
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;
}
_
nhgrifに感謝します。実際にあなたの答えに感謝しました。とても素晴らしかったので、私は何が起こっているのかを見つけました。彼らは、UIViewにグローバルカテゴリを作成しました。その呼び出されたUIView + mystyle。そこでは、次のシグネチャを持つメソッドがあります。
- (void) setStyleName:(NSString*) styleName
したがって、xcodeは「set」なしでこのメソッドを使用し、ランタイムキーパス属性と照合します。この方法では、属性を適用しています。