Iphone UIControl:sendActionsForControlEvents忽略UIEvent
我想实现一个自定义的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中: 现在,我需
- (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进行弱引用的替代解决方案,我会非常高兴听到它我确实考虑过这一点,但是它遇到了一个可怕的问题,你会发现所有的目标都会收到所有的控制事件,不管他们已经注册了什么。这是次优的。目前,我正在使用我自己在上面发布的黑客代码技巧。啊,等一下,我想我明白你现在的意思了。这看起来确实有可能。是的,这很有效!我已经将它引入了一个名为sendActionForControlEvent:withEvent:的私有方法中,并且正在使用它来代替sendActionsForControlEvents:坦白地说,我对互联网上关于这一疏忽的信息如此之少感到惊讶。