我想实现一个自定义的UIControl子类。它工作得很好,除了一个致命的问题,那就是让我吐牙。每当我使用sendActionsForControlEvents:向外发送操作消息时,它省略了包含一个UIEvent。例如,如果我将其链接到具有以下签名的方法:
- (IBAction) controlTouched:(id)sender withEvent:(UIEvent *)event..。事件总是返回为nil!这个问题似乎发生在sendActionsForControlEvents中:
现在,我需要我的IBAction能够确定触摸的位置。我通常是通过从事件中提取触点来实现的。当然,必须有某种方法来确保正确的事件被传递?这是使用UIControl的一个非常基本的部分!
有人知道法律上的变通方法吗?
发布于 2012-07-08 19:49:37
我假设这是因为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];
}
}发布于 2012-07-08 19:50:43
目前我有一个可能的解决方案,但我对此并不是很满意。然而,对于其他面临同样问题的人来说,这里就是。首先,为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的替代解决方案,我将非常高兴听到它!
https://stackoverflow.com/questions/11382816
复制相似问题