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 的 rightCalloutAccessoryViewleftCalloutAccessoryView,则点击该按钮时,您的地图代表应收到消息 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

将多个收件人电子邮件和姓名附加到 EmailMultiAlternatives

四配置qq邮箱报警,附加139邮箱配置

从共享表(ios)设置电子邮件发件人和收件人

确定电子邮件发件人并发送电子邮件

GoogleCast Receiver 应用程序可以在没有发件人应用程序的情况下读取 UDP 消息吗?