2010-11-28 8 views
0

私は、選択したテーブル行を詳しく調べるパネルを持っています。明らかに、パネルの表示は頻繁に更新する必要があり、私はそのタスクをNSWindowControllerサブクラスに移しました。プロパティのアクセサーをivarのメソッドに転送する

テキストフィールドの文字列値やNSImageViewsの画像値などのカスタムNSWindowControllerを@propertyにします。アクセサーには新しいコードは必要ないので、@synthesizeにしたいと思います。残念ながら(私にとっては)@synthesize property=ivarにキーパスを使用するオプションはありません。

明白な解決策は、フォームの私自身のアクセサ

- (void)setTitle:(NSString *)title 
{ 
    [titleTextField setStringValue:title]; 
} 

- (NSString *)title 
{ 
    return [titleTextField stringValue]; 
} 

を書くことですが、私はむしろ、いくつかのプロパティごとに手でそれを行う必要はありませんと思います。

もっと簡単な方法はありますか?おそらく、別のオブジェクトの特定のプロパティ(objectValueなどを除いて、実際には適切なプロパティではない)に転送するプロパティを設定する一般的な方法はありますか?

答えて

0

テキストフィールドのプロパティ名がクラスのプロパティ名と異なるため、転送を行うのは役に立たないとは思いません。

文字列プロパティを公開して抽象化するのはもちろんのことですが、このボイラープレートを作成しないようにするには、単にテキストフィールド自体をプロパティとして公開するだけでよいでしょう。 Apples APIのいくつか、特にtextのようなプロパティを持つのではなく、SDK 3.0のどこのiPhoneにあるのかを、今ではtextLabelのテーブルセルで確認できます。呼び出し先がラベルやテキストフィールドを何らかの方法でカスタマイズしたい場合は、よりシンプルでカスタマイズも可能です。

1

クラスにvalueForUndefinedKey:を実装した場合は、キー値パスのルックアップを解決して、すべてのオブジェクトを他のオブジェクトに転送する最後のチャンスが得られます。ただしこれは確かに実演ではなく、通過するプロパティ名のほとんどがターゲットオブジェクトのプロパティ名と一致する場合にのみ、大きな利益をもたらします。

0

あなたは矛盾していますが、あなたはそれらを合成したいので新しいコードは必要ないと言いますが、必要なコードは全く新しいものです。プロパティは、いくつかの一般的なケースの構文的な砂糖ですが、これは1つではありません。

必要な操作を行うにはいくつかの方法があります。 @Justinがsetvalueをオーバーライドすることを示唆しているからです:forundefinedkey: - 前方ターゲットの検索が必要ですが、プロパティの砂糖はこれに適していません。

+0

「私はアクセサーに新しいコードは必要ありません」とは、最初のアクセス時などに値を遅延ロードするなどしたくないということです。合成されたアクセサーは可能です)。 – Richard

関連する問題