UIControl:sendActionsForControlEvents省略了UIEvent

时间:2012-07-08 11:34:48

标签: iphone ios ipad subclass uicontrol

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

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

......活动总是以零回复!问题似乎发生在sendActionsForControlEvents:

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

任何人都知道法律解决方法吗?

2 个答案:

答案 0 :(得分:4)

我认为这是因为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];
    }
}

答案 1 :(得分: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的弱引用,我会高兴极了听到它!