覆盖 addTarget 方法

Posted

技术标签:

【中文标题】覆盖 addTarget 方法【英文标题】:Override addTarget method 【发布时间】:2012-08-18 09:21:18 【问题描述】:

我有 UIControl 的子类,并且想覆盖 sendAction:to:forEvent 方法,以便我可以发送我自己的自定义 UIEvent(这样我就可以保留 UIControlEvents 变量)。但是,由于我只需要处理一个 UIEvent,因此我无法保留 UIControlEvents 变量。

因此,我认为我需要重写 addTarget 方法,以便保留 UIControlEvents 变量。


主要问题:

那么有谁知道如何实现 addTarget 方法来保留它应该的功能而不覆盖它?此外,有没有人知道更好的解决方案,因为苹果默认不提供此信息(通过 UIEvent 对象的 UIControlEvents 变量)。

【问题讨论】:

【参考方案1】:

在你的子类中提供你自己的 addTarget 方法,但不要调用 super。保存目标和选项,并让自己成为该选项的目标。当该事件的操作方法被发送给您时,您可以采取任何您想要的操作。

编辑:所以你有一个子类,并且想要保存添加的目标等。声明一个可变数组。当您收到此消息时:

- (void)addTarget:(id)target action:(SEL)action forControlEvents(UIControlEvents)controlEvents

在您的子类中,您可以这样添加这个可变字典:

[myArray addObject:[@"target" : target, @"action" : NSStringFromSelector(action), @"event" : [NSValue valueWithBytes:&controlEvents objCType:@encode(controlEvents)]];

虽然这乍一看似乎令人生畏,但并不是那么复杂。

现在我们拥有了每个想要了解每个可能的控制事件的注册对象。您的代码现在可以决定何时或是否通知一个或多个目标有关任何 controlEvent 的方法,方法是遍历数组并找到每个想要了解某某事件的对象。

然后,您的子类决定任何事件,谁会收到关于什么的通知。

【讨论】:

那么在代码中,它看起来如何?我已经创建了自己的 addTarget 方法,但是我不知道如何“保存目标和选项,并让自己成为该选项的目标”。谢谢!

以上是关于覆盖 addTarget 方法的主要内容,如果未能解决你的问题,请参考以下文章

UIControl (addTarget:action:forControlEvents:) @selector 参数

对 addTarget:action:forControlEvents 的 addTarget 指针行为感到困惑:

Swift:addTarget 动作是不是只允许类方法?

UIButton 类参考文档上的 addTarget 方法

如何在 swift 3 中使用 addTarget 方法

使用 addTarget:action:forControlEvents: 方法更改 UIImage?