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的弱点,我会很高兴听到它!