2011-01-06 7 views
4

addTargetにできることは素晴らしいことです。私はターゲットメソッドが呼び出されたときに、その状態(任意のID)を送信者から魔法のように引き出すことができるように、私はUIButtonに状態を付けることができるいくつかの卑劣な方法がほしいと思うだけです。UIコントロールまたはNSObjectへのコンテキストの追加

のような何か:UIButtonは、開発者がものを突き出すでした「IDコンテキスト」プロパティを持っていた場合

-(void) touchyTouchy:(id) sender { 
    UIButton button = (UIButton*)sender; 
    id foo = [button getByObjectBack]; 
    // do something interesting with foo 
} 

は素晴らしいことだが、それはしていないようです:続く

[button shoveMyObjectInThere:foo]; 
[button addTarget:self action:@selector(touchyTouchy:) forControlEvents:UIControlEventTouchUpInside]; 

ケース。 Objective-Cは非常に動的な言語なので、実行時にメソッドやフィールドをオブジェクトに追加することができるかどうか疑問に思っていますか?

+1

私はそのセレクタの名前を見たときに笑った! :) –

答えて

5

あなたは公式のソリューションは、 "タグ" プロパティを使用することです

#import <objc/runtime.h> 

objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy); 
objc_getAssociatedObject(id object, void *key); 
+0

これは完璧です!どうもありがとうございます! –

0

Objective-CのKey-Valueコーディング機能の一部であるsetValue:forKey:はどうでしょうか?

+0

渦とドキュメントと私の実験は、それが既存のフィールドやアクセサの設定だけであることを示しているようです。 –

+0

KVCを使用して新しいメンバーデータを追加することはできないようです。 [なぜオブジェクトがキー値をコードに準拠していないのですか?]を参照してください(http://stackoverflow.com/q/11491957/1804403) – Skotch

0

私はすぐにテストを行い、興味深い結果を見つけました。

UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
[button setTitle:@"Hello" forState:UIControlStateNormal]; 
[button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside]; 
button.frame = CGRectMake(100, 100, 100, 100); 
[self.window addSubview:button]; 

// ... 

- (void)buttonClicked:(id)sender { 
    NSLog(@"button clicked %@", [sender class]); 
} 

これは、出力します。これが可能でなければなりませんようにbutton clicked UIRoundedRectButton

をだから、真実が語られる...そうです、私が働いて、完全な例を取得するためにUIButtonをサブクラス化するいくつかの問題に遭遇したが、これは有望と思われます。

その後
[self.someMutableArray addObject:foo]; 
button.tag = self.someMutableArray.count - 1; 

[button addTarget:self action:@selector(touchyTouchy:) forControlEvents:UIControlEventTouchUpInside]; 

:ほとんどで

-(void) touchyTouchy:(id) sender { 
    UIButton button = (UIButton*)sender; 
    id foo = self.someMutableArray[button.tag]; 
    // do something interesting with foo 
} 

:)

+0

この回答は質問に関連しているようです。あなたは 'buttonClicked:'で引き抜くことができるUIButtonにコンテキストを追加していません。 – Skotch

0

連想参照して試みることができますタグの場合はenumまたは定数を使用しますが、配列は明らかに柔軟性があります。

関連する問題