首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIControl: sendActionsForControlEvents省略UIEvent

UIControl: sendActionsForControlEvents省略UIEvent
EN

Stack Overflow用户
提问于 2012-07-08 19:34:48
回答 2查看 6.2K关注 0票数 5

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

代码语言:javascript
复制
- (IBAction) controlTouched:(id)sender withEvent:(UIEvent *)event

..。事件总是返回为nil!这个问题似乎发生在sendActionsForControlEvents中:

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

有人知道法律上的变通方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-08 19:49:37

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

您可以尝试单独发送所有操作(根据文档,复制sendActionsForControlEvents:方法所做的事情),这样您就可以明确地将它们与UIEvent关联起来

代码语言:javascript
复制
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];
    }
}
票数 5
EN

Stack Overflow用户

发布于 2012-07-08 19:50:43

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

代码语言:javascript
复制
@property (nonatomic, assign) UIEvent * currentEvent;

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

代码语言:javascript
复制
self.currentEvent = event;
[self sendActionsForControlEvents: UIControlEventTouchDown];

最后,覆盖下面的方法:

代码语言:javascript
复制
- (void) sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event
{
    [super sendAction:action to:target forEvent:self.currentEvent];
}

这是可行的,但我一点也不喜欢它,所以如果有人有不依赖于弱引用UIEvent的替代解决方案,我将非常高兴听到它!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11382816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档