Iphone UIControl:sendActionsForControlEvents忽略UIEvent

Iphone UIControl:sendActionsForControlEvents忽略UIEvent,iphone,ios,ipad,subclass,uicontrol,Iphone,Ios,Ipad,Subclass,Uicontrol,我想实现一个自定义的UIControl子类。它工作得很好,除了一个致命的问题,那就是让我吐牙齿。每当我使用sendActionsForControlEvents:发送操作消息时,它都会忽略包含UIEvent。例如,如果我将其链接到具有以下签名的方法: - (IBAction) controlTouched:(id)sender withEvent:(UIEvent *)event 。。。事件总是以零的形式返回!问题似乎发生在sendActionsForControlEvents中: 现在,我需

我想实现一个自定义的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];
    }
}

目前我有一个可能的解决办法,但我对此不太满意。然而,对于其他面临同样问题的人来说,这就是问题所在。首先,为UIEvent声明局部变量或属性,因此:

@property (nonatomic, assign) UIEvent * currentEvent;
现在,在您的触摸处理例程中,在调用[self-SendActions ForControlEvents:]之前,将该局部变量设置为该例程的当前UIEvent,当然,用您想要发送的任何操作替换uicontrol事件触地

self.currentEvent = event;
[self sendActionsForControlEvents: UIControlEventTouchDown];
最后,覆盖以下方法:

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

这是可行的,但我一点也不喜欢它,因此,如果有人有一个不依赖于对UIEvent进行弱引用的替代解决方案,我会非常高兴听到它