在Obj-C中带参数的选择器

时间:2010-02-11 02:04:54

标签: iphone objective-c sdk

所以基本上我有一个很大的按钮列表,它们会显示下拉列表和其他内容,这些按钮是动态创建的。因此,为了捕获适当按钮数据的值,我需要将它的动作选择器设置为一个额外增加一个参数的函数。

例如,在此下拉列表中使用此选择器,使用下面的方法,将返回无法识别选择器的错误。如何让选择器识别我传入的参数? (在这种情况下变量'name')

苹果文档: http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocSelectors.html#//apple_ref/doc/uid/TP30001163-CH23-SW1

在标题“目标 - 操作设计模式”的最后一段中,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
}

3 个答案:

答案 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 上的任何现有属性发生冲突