iOS可以附加回调并关联不同的发件人吗?
Posted
技术标签:
【中文标题】iOS可以附加回调并关联不同的发件人吗?【英文标题】:iOS attaching callbacks and associating different sender possible? 【发布时间】:2011-03-11 18:36:06 【问题描述】:假设我有一个按钮要添加到地图视图中的注释对象中:
AnnotationButton* rightButton = [AnnotationButton buttonWithType:UIButtonTypeDetailDisclosure];
[rightButton addTarget:self
action:@selector(showDetails:)
forControlEvents:UIControlEventTouchUpInside];
您会注意到该按钮在单击时会调用函数showDetails
。
显示详细信息定义为- (void)showDetails:(id)sender;
并接受一个发件人。有没有办法发送更多变量,或关联不同的发件人?原因是我希望单击的按钮告诉我哪个注释与该按钮相关联。将注释视为在创建按钮的上下文中可用的其他对象。
我考虑过继承 UIButton 类,然后在其中存储其他信息,但这似乎是一种 hack。
有什么想法吗?
【问题讨论】:
【参考方案1】:如果此按钮用于 MKAnnotationView 的 rightCalloutAccessoryView
或 leftCalloutAccessoryView
,则点击该按钮时,您的地图代表应收到消息 mapView:annotationView:calloutAccessoryControlTapped:
。这会给你一个被点击的 MKAnnotationView 实例,它有一个annotation
属性来给你相应的注释。您应该利用它而不是尝试直接在按钮上使用操作。
【讨论】:
【参考方案2】:不,无法更改发送到操作消息的内容。您可以要求两个参数,但它们将是按钮和触发它的事件。要得到你想要的,你有两个选择(我现在能想到的)。
-
使用按钮的
tag
属性。您可以给每个按钮一个唯一的标签来标识注释,例如数组中注释的索引。然后很容易在你的showDetails:
方法中得到注解。
子类 UIButton。向内置对象添加功能并没有错。您只需要添加一个属性来保存某个对象。奖励:如果您为属性使用通用的id
类型并给它一个通用名称,例如representedObject
,您将来也可以在其他项目中使用它。
来自 Anomie 使用 objc_setAssociatedObject 将值添加到按钮而不进行子类化。您可能希望向 UIButton 添加一个类别以使其更易于使用。
【讨论】:
3.使用objc_setAssociatedObject(尽管如果有人认为子类化 UIButton 是一种黑客行为,那么人们可能会认为这更像是一种黑客行为)。 @Anomie 谢谢,我会补充的。请记住,它需要 ios 4 或更高版本。 你确定吗?我好像记得在 3.1 天内用过。 你说得对,它只有 OS X 有一定的使用要求。我会在我的帖子中解决这个问题。以上是关于iOS可以附加回调并关联不同的发件人吗?的主要内容,如果未能解决你的问题,请参考以下文章
iOS - 将发件人(按钮)名称传递给 addSubview