将上下文添加到UI控件或NSObject

时间:2011-01-06 00:05:33

标签: objective-c ios uibutton nsobject

能够在addTargetUIButton非常棒。我只希望有一些偷偷摸摸的方式我可以将状态附加到UIButton,以便在调用目标方法时,我可以神奇地从发送方中提取该状态(任何id)。

类似的东西:

[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 context'属性,开发人员可以推送东西,那会很棒,但事实并非如此。 Objective-C是一种非常动态的语言,所以我想知道是否有一些偷偷摸摸的方式我可以在运行时向对象添加方法或字段?

4 个答案:

答案 0 :(得分:5)

您可以尝试制作关联参考

#import <objc/runtime.h>

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

答案 1 :(得分:0)

setValue:forKey:这样的东西,Objective-C的Key-Value编码功能的一部分呢?

答案 2 :(得分: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以使完整的示例工作,但这看起来很有希望。 :)

答案 3 :(得分:0)

官方解决方案是使用“tag”属性:

onBindViewHolder

然后:

[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 } 或常量,但数组显然更灵活。