在[UIButton addTarget]中传递自定义数据

时间:2011-04-16 23:12:58

标签: iphone objective-c

如何在UIButton

中指定目标时添加自定义数据
id data = getSomeData();
[button addTarget:self 
           action:@selector(buyButtonTapped:event:) 
 forControlEvents:UIControlEventTouchUpInside];

我希望buyButtonTapped函数看起来像:

(void) buyButtonTapped: (UIButton *) button event: (id) event data: (id) data

3 个答案:

答案 0 :(得分:67)

不可能。由UIControl触发的操作可以有3个不同的签名。

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

它们都不允许您发送自定义数据。


根据您的目的,您可以通过不同方式访问数据。

例如,如果按钮位于UITableView中,您可以使用以下内容:

- (IBAction)buttonPressed:(UIButton *)sender {
    CGPoint buttonOriginInTableView = [sender convertPoint:CGPointZero toView:tableView];
    NSIndexPath *indexPath = [tableView indexPathForRowAtPoint:buttonOriginInTableView];
    NSData *customData = [myDataSource customDataForIndexPath:indexPath];
    // do something
}

始终有一种方法可以在不将数据传递给按钮的情况下获取数据。

答案 1 :(得分:21)

您无法向操作方法发送额外数据。有许多方法可以将数据与按钮相关联,但除非数据是单个NSInteger,否则没有一种方法特别简单。

  • 您可以使用tag属性来保存单个NSInteger。这可能就是您所需要的,或者您可以使用它来查找数组或字典中的对象。
  • 您可以将UIButton子类化,以添加ivars / properties来存储您需要的数据。
  • 您可以使用[NSValue valueWithNonretainedObject:button]作为字典的键。
  • 我个人最喜欢的一次性,您可以使用[关联参考]将数据对象与按钮相关联。

答案 2 :(得分:-3)

你真的不能这样做。你可以做的是将数据放在字典中,然后使用按钮来获取它。

E.g。

myDataDict = [NSDictionary dictionaryWithObjectsAndKeys:someData, button, nil];

然后呢;

-(void) buttonPress:(id)sender
{
  data = [dataDict objectForKey:sender];
}

如果您在InterfaceBuilder中指定了按钮,则可以使用按钮的“tag”属性来查找数据,但您需要将其转换为NSNumber以与字典一起使用。