1

假设我有一个要添加到地图视图中的注释对象的按钮:

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

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

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

我考虑过继承 UIButton 类,然后在其中存储其他信息,但这似乎是一种 hack。

有任何想法吗?

4

2 回答 2

3

如果此按钮用于MKAnnotationView 的rightCalloutAccessoryViewor ,当点击按钮时leftCalloutAccessoryView,您的地图代表应该会收到消息mapView:annotationView:calloutAccessoryControlTapped:。这会为您提供被点击的 MKAnnotationView 实例,该实例具有annotation为您提供相应注释的属性。您应该利用它而不是尝试直接在按钮上使用操作。

于 2011-03-12T03:34:44.593 回答
2

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

  1. 使用按钮的tag属性。您可以给每个按钮一个唯一的标签来标识注释,例如数组中注释的索引。然后很容易在您的showDetails:方法中获取注释。
  2. 子类 UIButton。向内置对象添加功能并没有错。您只需要添加一个属性来保存某个对象。奖励:如果您为属性使用泛型id类型并给它一个泛型名称,例如representedObject,您将来也可以在其他项目中使用它。
  3. 从 Anomie使用 objc_setAssociatedObject 将值添加到按钮而不进行子类化。您可能希望向 UIButton 添加一个类别以使其更易于使用。
于 2011-03-11T18:53:10.493 回答