5

我想实现 UIControl 的自定义子类。它工作得很好,除了一个让我吐牙的致命问题。每当我使用 sendActionsForControlEvents: 发送操作消息时,它都会忽略包含 UIEvent。例如,如果我将其链接到具有以下签名的方法:

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

...事件总是返回为零!该问题似乎发生在 sendActionsForControlEvents 中:

现在,我需要我的 IBAction 来确定触摸的位置。我通常通过从事件中提取触摸来做到这一点。当然必须有某种方法来确保传递正确的事件?这是使用 UIControl 的一个非常基本的部分!

有人知道合法的解决方法吗?

4

2 回答 2

5

我认为这是因为该sendActionsForControlEvents:方法无法知道UIEvent您的控制事件应该与哪个(如果有)相关联。

您可以尝试分别发送所有操作(sendActionsForControlEvents:根据文档复制该方法的功能),因此您可以将它们与 a 相关联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];
    }
}
于 2012-07-08T11:49:37.267 回答
0

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

@property (nonatomic, assign) UIEvent * currentEvent;

现在,在您的触摸处理例程中,在调用 [self sendActionsForControlEvents:] 之前,将该局部变量设置为该例程的当前 UIEvent,当然,将 UIControlEventTouchDown 替换为您要发送的任何操作。

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 进行弱引用的替代解决方案,我会很高兴听到它!

于 2012-07-08T11:50:43.380 回答