所以基本上我有一个很大的按钮列表,它们会显示下拉列表和其他内容,这些按钮是动态创建的。因此,为了捕获适当按钮数据的值,我需要将它的动作选择器设置为一个额外增加一个参数的函数。
例如,在此下拉列表中使用此选择器,使用下面的方法,将返回无法识别选择器的错误。如何让选择器识别我传入的参数? (在这种情况下变量'name')
在标题“目标 - 操作设计模式”的最后一段中,Apple Docs 暗示可以这样做,但不提供使用自定义消息的示例,或者可能我只是误会了?
SEL sel = @selector(openDropdown:name:);
[dropdownSelector addTarget:self action:sel forControlEvents:UIControlEventTouchUpInside];
-(void) openDropdown: (NSString *) anotherArg : (id) sender {
// Stuff here based on anotherArg
}
答案 0 :(得分:3)
您应该可以从id
输入参数
UIButton *button = (UIButton *) sender
NSString *title = [button currentTitle];
无需传递额外的参数
答案 1 :(得分:2)
你所要求的是无法做到的。来自文档:
UIKit允许三种不同形式的动作选择器:
- (void)action
- (void)action:(id)sender
- (void)action:(id)sender forEvent:(UIEvent *)event
由于您对事件参数没有影响,sender
对象必须包含您要传递给操作方法的所有信息。
尽管你在评论mihirsm的答案中写了什么,但你确实可以将UIButton子类化为每个按钮实例添加你想要的所有附加信息。您还可以使用按钮的tag
属性来识别它(为每个按钮分配一个唯一的标签),并使用标签作为键将所有其他信息存储在数组或字典中。
更新:将来,您还可以使用associative storage向对象添加数据,而无需对其进行子类化,但此技术尚未在iPhone平台上提供(仅适用于10.6)那一刻)。
答案 2 :(得分:1)
CALayer
支持键值编码的任意键;您可以使用它来附加任意图层:
[[button1 layer] setValue:@"firstButtonData" forKey:@"myKey"];
[[button2 layer] setValue:@"secondButtonData" forKey:@"myKey"];
后来:
- (void)action:(id)sender forEvent:(UIEvent *)event
{
NSLog(@"Data for the button that was pressed: %@", [[sender layer] valueForKey:@"myKey"]);
}
小心不要与CALayer
上的任何现有属性发生冲突