4

能够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

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 回答
0

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

[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
}

在大多数情况下,您会使用enumor 常量作为标记,但数组显然更灵活。

于 2017-12-06T06:14:11.353 回答