4

addTargetでできるのは素晴らしいことUIButtonです。ターゲットメソッドが呼び出されたときに、その状態(任意のID)を送信者から魔法のようにプルできるように、UIButtonに状態をアタッチできる卑劣な方法があればいいのにと思います。

何かのようなもの:

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

に続く:

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

UIButton に、開発者が何かを押し込める「id コンテキスト」プロパティがあれば素晴らしいと思いますが、そうではないようです。ただし、Objective-C は非常に動的な言語なので、実行時にオブジェクトにメソッドまたはフィールドを追加できる卑劣な方法があるのだろうか?

4

4 に答える 4

5

連想参照を作成してみてください

#import <objc/runtime.h>

objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy); 
objc_getAssociatedObject(id object, void *key);
于 2011-01-10T17:05:28.133 に答える
0

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

于 2011-01-06T00:22:22.723 に答える
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完全な例を機能させるためにサブクラス化する際にいくつかの問題に遭遇しましたが、これは有望に思えます。:)

于 2011-01-06T00:34:22.580 に答える