iOS附加回调并关联不同的发件人可能吗?

时间:2011-03-11 18:36:06

标签: iphone callback uibutton sender

假设我有一个按钮,我将其添加到mapview中的注释对象:

 AnnotationButton* rightButton = [AnnotationButton buttonWithType:UIButtonTypeDetailDisclosure];
            [rightButton addTarget:self
                            action:@selector(showDetails:)
                  forControlEvents:UIControlEventTouchUpInside];

您会注意到该按钮在单击时调用函数showDetails

显示详细信息定义为- (void)showDetails:(id)sender;并接收发件人。有没有办法发送更多变量,或关联不同的发件人?原因是我想点击按钮告诉我哪个注释与该按钮相关联。将注释视为在创建按钮的上下文中可用的其他对象。

我想过继承UIButton类,然后在其中存储其他信息,但这看起来像是一个黑客。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

如果此按钮用于MKAnnotationView的rightCalloutAccessoryViewleftCalloutAccessoryView,则点击该按钮时,地图的代理人应收到消息mapView:annotationView:calloutAccessoryControlTapped:。这将为您提供已轻触的MKAnnotationView实例,该实例具有annotation属性,可为您提供相应的注释。您应该使用它而不是尝试直接在按钮上使用操作。

答案 1 :(得分:2)

不,无法更改发送到操作消息的内容。你可以要求两个参数,但它们将是按钮和触发它的事件。为了得到你想要的东西,你有两个选择(我现在可以想到)。

  1. 使用按钮的tag属性。您可以为每个按钮指定一个唯一标记,用于标识注释,例如数组中注释的索引。然后,您可以轻松地在showDetails:方法中获取注释。
  2. 子类UIButton。向内置对象添加功能没有任何问题。您需要添加的所有内容都是保存某个对象的属性。额外奖励:如果您对该属性使用通用id类型并为其指定通用名称,例如representedObject,则您将来也可以在其他项目中使用它。
  3. 来自Anomie的
  4. 使用objc_setAssociatedObject为按钮添加值而不进行子类化。您可能希望向UIButton添加一个类别,以便于使用。