2011-01-13 9 views
4

私はおそらくちょっとここで怠け者ですが、私に同行してください。ここに私の状況です。私は2つの非原子的な、保持されたプロパティを持つクラスを持っています。例:@synthesizedプロパティをカスタマイズすることは可能ですか?

@property (nonatomic, retain) UITextField *dateField; 
@property (nonatomic, retain) NSDate *date; 

私は実装で期待通りにそれらを合成します。私がしたいことは、dateのsetterが呼び出されるたびにdateFieldに何かをすることです(つまり、dateFieldのtextプロパティを日付のきれいにフォーマットされたバージョンに設定します)。

私はちょうど手動で次の手順を実行して、私の実装では日付のセッターをオーバーライドすることができます実現:まだ私はObjective Cのは、保持/リリースサイクルを処理させることができれば

- (void) setDate:(NSDate *)newDate { 
    if (date != newDate) { 
     [date release]; 
     date = [newDate retain]; 
     // my code to touch the dateField goes here 
    } 
} 

素晴らしいだろうどのようなことですが、 retain/release/setが発生した後に呼び出されるカスタムハンドラを「登録」できます(より良い用語がないため)。私の推測は不可能です。私のgoogle-fuはこれに答えを出さなかったので、私は頼むと思った。

答えて

4

KVO(キー/値観測)はこれを行うことができますが、それはさらに多くのコードになり、おそらく読んだり書いたりするのが簡単ではありません。

あなたはKVOに精通かもしれませんが、場合には、あなた(またはその他)ではありません:あなたのinit機能では、あなたはこれを行うだろう:

[self addObserver:self forKeyPath:@"date" options:0 context:NULL]; 

その後、あなたはこれを実装します:

-(void)observeValueForKeyPath:(NSString*)keyPath 
        ofObject:(id)object 
         change:(NSDictionary*)change 
         context:(void*)context 
{ 
    if (object == self && [keyPath isEqualToString:@"date"]) { 
     // code to touch the dateField goes here 
    } 
} 

最後に、deallocに、あなたはこれを行うだろう:

[self removeObserver:self forKeyPath:@"date"]; 

ご覧のように、それはさらに多くのコードであり、分かりにくいです。 KVOはObjective-Cの主な "データバインディング"機能です。多くのコードを少なくしてデータをバインドできるプラットフォーム(例:Flex)がありますが、Objective-Cでは多くの作業が必要です。ところで

、ない大したことが、あなたが示したサンプルコードにバグがある - それはおそらくより次のようになります。

- (void) setDate:(NSDate *)newDate { 
    if (date != newDate) { 
     [date release]; 
     date = [newDate retain]; 
     // my code to touch the dateField goes here 
    } 
} 
+0

右ので、関連する質問は、(保持どこ1は@synthesizeは、様々な状況で何のためのサンプルコードを見つけることができるです、割り当て、原子など) –

+0

クール、答えに感謝します。私は理論的にはKVOについて知っていますが、その例を得ることは素晴らしいことです。 setterコードのバグを指摘してくれてありがとう。私は実際にそれを使用せずに(明らかに)書きました。私は質問を編集して、他の人に誤解を与えないようにします。 –

+0

私は盲目でなければなりません...コードで何を修正しましたか?ああ..質問は編集されている必要があります。 – Schultz9999

0

を[OK]をクリックする(プライベートIVAR /プロパティを作成することによって達成することができます、あなたは別の名前で)プロパティは、理想的には、明白な名前を使用して、プライベートで文書化する必要があります、

@property (nonatomic, retain) UITextField *dateField; 
@property (nonatomic, retain) NSDate *date; // interface only 
@property (nonatomic, retain) NSDate *datePRIVATE; // the real ivar. 
... 
@synthesize datePRIVATE; 
- (void)setDate:(NSDate *)newDate { 
    self.datePRIVATE = newDate; 
    [self.dateField updateDisplayedDate:self.datePRIVATE]; 
} 
関連する問題