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

Posted

技术标签:

【中文标题】将上下文添加到 UI 控件或 NSObject【英文标题】:Adding context to a UI control or NSObject 【发布时间】:2011-01-06 00:05:33 【问题描述】:

很高兴能够在UIButtonaddTarget。我只希望有一些偷偷摸摸的方法可以将状态附加到 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 是一种非常动态的语言,所以我想知道是否有一些偷偷摸摸的方法可以在运行时向对象添加方法或字段?

【问题讨论】:

哇,当我看到选择器名称时,我笑了!!! :) 【参考方案1】:

你可以尝试做一个关联引用

#import <objc/runtime.h>

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

【讨论】:

这太完美了!非常感谢!【参考方案2】:

setValue:forKey: 这样的东西呢,它是 Objective-C 的键值编码功能的一部分?

【讨论】:

试一试,文档和我的实验似乎表明这仅用于设置现有字段/访问器。 似乎无法使用 KVC 添加新成员数据。见Why is my object not key value coding-compliant?【参考方案3】:

所以我只是做了一个快速测试,发现了一些有趣的结果。

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 以使完整的示例正常工作,但这似乎很有希望。 :)

【讨论】:

这个答案似乎与问题无关。你还没有在buttonClicked:中给UIButton添加任何可以拉出的上下文@【参考方案4】:

官方的解决方案是使用“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

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

【讨论】:

以上是关于将上下文添加到 UI 控件或 NSObject的主要内容,如果未能解决你的问题,请参考以下文章

向 Kendo UI 上下文菜单项添加附加数据

将 WriteableBitmap 线程化到图像控件

UI控件之菜单(Menu)

android ui控件都有哪些

Qt QTreeWidget 上下文菜单:在另一个下添加项目或删除项目。

Drupal 7 查看上下文过滤器或逻辑