自定义 UIControl 总是发送 nil UIEvent 对象

Posted

技术标签:

【中文标题】自定义 UIControl 总是发送 nil UIEvent 对象【英文标题】:Custom UIControl always sends nil UIEvent objects 【发布时间】:2011-07-29 22:05:27 【问题描述】:

我有一个派生自 UIControl 的类,我在其中监视 touchesBegan/Moved/Ended/Cancelled 事件。在这些事件中,我在超级响应者和下一个响应者上调用相同的事件,如下所示:

[self.nextResponder touchesEnded:touches withEvent:event];
[self sendActionsForControlEvents:UIControlEventTouchUpInside];
[super touchesEnded:touches withEvent:event];

我有一个拥有表格视图的父控件。表格视图中的每个单元格都包含我的一个自定义控件。为了响应单击,我在创建控件并将其添加到表格视图单元格时为其分配了一个选择器,如下所示:

[myControl addTarget:self action:@selector(myControlTap:withEvent:)forControlEvents:UIControlEventTouchUpInside]; 
[cell.contentView addSubview:myControl];

父控件的选择器如下所示:

- (void)myControlTap:(id)sender withEvent:(UIEvent *)event
     //UIEvent is always null!

有人能告诉我为什么 UIEvent 总是为零吗?如果我使用 UIButton 的实例而不是我的自定义 UIControl,则 UIEvent 不为零。此外,如果我不在控件中调用 sendActionsForControlEvents,那么父控件将永远不会收到任何事件通知。

【问题讨论】:

只是为了确认一下,当您将NSLog(@"%@", event); 放入您的myControlTap:withEvent: 方法时,输出是什么? 【参考方案1】:

在方法和选择器中将“withEvent”改为“forEvent”。

【讨论】:

以上是关于自定义 UIControl 总是发送 nil UIEvent 对象的主要内容,如果未能解决你的问题,请参考以下文章

自定义 UIControl 和手势识别器

在自定义 UIControl 对象中定义自定义触摸区域

CAShapeLayers 未在自定义子类 (UIControl) 中绘制

使用自定义 UIControl 自动调整 UIScrollView 内容偏移

在警报级别窗口中具有自定义 inputView 的 UIControl

子类 UIControl 来制作自定义选择器