UIControl:sendActionsForControlEvents省略UIEvent

我想实现一个UIControl的自定义子类。 它除了一个致命的问题,使我吐牙,美丽的作品。 每当我使用sendActionsForControlEvents:发送一个动作消息,它就省略了包含一个UIEvent。 例如,如果我将它链接到具有以下签名的方法:

- (IBAction) controlTouched:(id)sender withEvent:(UIEvent *)event 

…事件总是回来,为零! 问题似乎发生在sendActionsForControlEvents内:

现在,我需要我的IBAction来确定触摸的位置。 我通常通过从事件中提取触动来做到这一点。 一定有办法确保正确的事件发生? 这是使用UIControl的一个非常重要的部分!

任何人都知道一个法律的解决方法?

我会假设这是因为sendActionsForControlEvents:方法不能知道你的控件事件应该与哪个UIEvent (如果有的话)相关联。

您可以尝试单独发送所有操作(根据文档复制sendActionsForControlEvents:方法所做的操作),因此您可以将它们与UIEvent进行特定的关联:

 UIEvent *event = ...; UIControlEvents controlEvent = ...; for (id target in [self allTargets]) { NSArray *actions = [self actionsForTarget:target forControlEvent:controlEvent]; for (NSString *action in actions) { [self sendAction:NSSelectorFromString(action) to:target forEvent:event]; } } 

目前我有一个可能的解决scheme,但我不是很高兴。 对于其他面临同样问题的人来说,就是这样。 首先,为UIEvent声明一个局部variables或属性:

 @property (nonatomic, assign) UIEvent * currentEvent; 

现在,在您的触摸处理例程中,在调用[self sendActionsForControlEvents:]之前,将该局部variables设置为该例程的当前UIEvent,然后使用您希望发送的任何操作replaceUIControlEventTouchDown。

 self.currentEvent = event; [self sendActionsForControlEvents: UIControlEventTouchDown]; 

最后,重写下面的方法:

 - (void) sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event { [super sendAction:action to:target forEvent:self.currentEvent]; } 

这是有效的 ,但是我一点都不喜欢,所以如果有人有另一种解决scheme,不依赖于UIEvent的弱点,我会很高兴听到它!