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

Iphone 在[UIButton addTarget]中传递自定义数据,iphone,objective-c,Iphone,Objective C,在ui按钮中指定目标时如何添加自定义数据 id data = getSomeData(); [button addTarget:self action:@selector(buyButtonTapped:event:) forControlEvents:UIControlEventTouchUpInside]; 我希望buybuttonattaped函数如下所示: (void) buyButtonTapped: (UIButton *) button event:

ui按钮中指定目标时如何添加自定义数据

id data = getSomeData();
[button addTarget:self 
           action:@selector(buyButtonTapped:event:) 
 forControlEvents:UIControlEventTouchUpInside];
我希望
buybuttonattaped
函数如下所示:

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

不可能。由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
}

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

你不能真的那样做。您可以做的是将数据放入字典中,然后使用按钮稍后获取数据

例如

后来,

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

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

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

  • 您可以使用
    标记
    属性来保存单个NSInteger。这可能是您所需要的全部,或者您可以使用它在数组或字典中查找对象
  • 您可以将UIButton子类化,以添加IVAR/属性来存储所需的数据
  • 您可以使用
    [NSValue valueWithNonretainedObject:button]
    作为字典的键
  • 我个人的最爱对于一次性,您可以使用[关联引用]将数据对象与按钮关联

请注意,使用按钮本身作为字典键将复制按钮对象,此时它可能不再与原始对象进行比较。而
标记
属性可以与IB一起使用,也可以不与IB一起使用。@Anomie:事实上,我甚至不认为按钮可以复制,因为它们不符合正常工作的
NSCopying
。谢谢它确实是UITableView中的一个自定义按钮。我想要的数据是UITableView本身,以确定单击了哪个按钮。它始终是一个tableview^^“总有办法…”你确定吗?是的,我确定。请随便挑战我。但我必须承认,有时需要一些难看的变通方法或添加更多的实例变量。@Michael您可以为单元格中的每个按钮调用不同的iAction。例如,如果你有一个向上按钮和向下按钮,当按下向上按钮时,你可以有一个功能upButtonPressed,还有一个函数DownButton在按下DownButton时按下。子类化UIButton肯定会起作用,而且应该是正确答案之一,imhotag最终是我所需要的,并为我节省了一些时间:)否则,我会子类化。这是一个更好的答案,选项4毫无意义:您必须有某种选择器才能传递给objc_setAssociatedObject,NSHipster使用一个类别来解决这个问题,那么为什么要使用opt呢。4点了吗?
-(void) buttonPress:(id)sender
{
  data = [dataDict objectForKey:sender];
}