2010-02-11 53 views
1

所以基本上我有一个大的按钮列表,这些按钮是存在的下拉列表和其他东西,并且这些按钮是动态创建的。因此,为了捕获适当的按钮数据的值,我需要将它的动作选择器设置为一个需要额外一个参数的函数。在Obj-C中带参数的选择器

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

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

所述包头“目标 - 动作设计模式”的最后一段,苹果文档暗示,这可以做,但不要举例说明使用自定义消息,或者我只是误解?

SEL sel = @selector(openDropdown:name:); 
[dropdownSelector addTarget:self action:sel forControlEvents:UIControlEventTouchUpInside]; 


-(void) openDropdown: (NSString *) anotherArg : (id) sender { 
// Stuff here based on anotherArg 
} 
+0

与现有的任何性质的碰撞上方的方法是不正确的,顺便说一句。 – bbum 2010-02-11 03:58:30

回答

3

您应该能够从id输入导出点击按钮的信息ARG

UIButton *button = (UIButton *) sender 
    NSString *title = [button currentTitle]; 

无需通过额外的PARAM

+0

我需要比按钮名称更多的细节。该按钮具有指定的按钮类型,核心数据中的ID等。我将扩展UIButton并添加我需要的参数,但是由于UIButton的工作方式,您实际上无法通过扩展来添加该类型的东西。这也不能解决真正的问题,那就是我只需要传送比发送者更多的数据。如果我想这样做,我需要将每个类用于应用中的每种类型的对象,并添加大量冗余数据。 – Jameson 2010-02-11 02:18:29

+0

没有看你的代码,就在我头顶 - 你可能会创建一个数据结构,比如说一个NSDictionary,例如{key = buttonId,value = buttonData}。然后,您可以从Action方法 – 2010-02-11 02:32:14

+0

内部访问buttonData我认为这是我最终可能做的。我所有的数据实际上都在核心数据中,所以我可以使用谓词来筛选出具有指定标题的按钮。唯一的问题是如果有两个按钮具有相同的标题,希望我能找到一个有用的方法来使用标签组件从核心数据中获取正确的值。 – Jameson 2010-02-11 02:37:26

2

什么你问能不能做到。从文档:

的UIKit允许三种不同形式的行动选择的:

- (void)action
- (void)action:(id)sender
- (void)action:(id)sender forEvent:(UIEvent *)event

既然你对事件参数没有影响,sender对象必须包括你想传递给操作方法的所有信息。

尽管你在你对mihirsm的回答的评论中写了什么,你的确可以继承UIButton的子类来添加你想要的每个按钮实例的所有附加信息。您也可以使用按钮的tag属性来识别它(为每个按钮分配一个唯一的标签),并使用标签作为关键字将所有附加信息存储在数组或字典中。

更新:在未来,你还可以使用associative storage将数据添加到对象,而不继承他们,但这种技术并不在iPhone平台上(还)提供(10.6只在一瞬间)。

+0

您可以继承UIButton,但无法访问它的组件。创建按钮时,您使用静态函数 [MyCustomUIButton buttonWithType:UIButtonTypeRoundedRect] 因此,稍后访问它时,您不会收到MyCustomUIButton对象,您将获得UIButtonTypeRoundedRect对象的派生。我知道发生这种情况是因为我尝试了它,然后通过在网络上查看来确认它。这是可能的,但它涉及实际上继承UIView并在其中放置一个按钮。这一切都非常复杂和黑客。你有其他方法吗? – Jameson 2010-02-11 02:35:54

+0

使用标签组件可能已经足够了,因为抬头了。 – Jameson 2010-02-11 02:38:07

1

CALayer s支持键值编码的任意键;你可以用它来连接任意层:

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

+0

感谢这就是我一直在寻找。它对我来说就像魅力一样 – pankaj 2013-03-23 10:36:19