如何告诉带有 UITextField 的自定义 UIView 接收触摸事件
Posted
技术标签:
【中文标题】如何告诉带有 UITextField 的自定义 UIView 接收触摸事件【英文标题】:How can I tell a custom UIView with UITextField receive touch events 【发布时间】:2013-06-06 23:48:36 【问题描述】:我正在使用的是我有一个自定义 UIView,它结合了 UILabel 和 UITextField 作为某些用户输入的一部分。我在应用程序中显示的整个视图中都有其中的几个。最好是能够让用户触摸 UILabel 或 UITextField,然后让 UITextField 允许输入字段。
有没有简单的方法可以做到这一点?
【问题讨论】:
【参考方案1】:在您的标签中添加一个轻击手势识别器,并在轻击时告诉相应的文本字段成为第一响应者(这会调出键盘)。
// In your init or awakeFromNib:
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelTapped:)];
self.label.userInteractionEnabled = YES;
[self.label addGestureRecognizer:tap];
...
- (void)labelTapped:(id)sender
[self.textField becomeFirstResponder];
【讨论】:
这很好,但它似乎只适用于自定义 UIView 之一。页面上的另一个不接受任何点击。 您应该将此代码添加到您的自定义 UIView 子类中,因此它应该适用于该子类的所有实例。听起来您正在 ViewController 中添加此代码... 它在 UIView 子类中。如果未正确设置视图的框架或边界,会产生我所看到的行为吗? 好吧,是我的错。我也有一些重写的方法来尝试处理 UIView 子类中的触摸。当我删除它们时,一切都按预期工作。【参考方案2】:是的,有,我实际测试过。您可以像这样向视图(包含标签和文本视图的视图)添加一个轻击手势识别器:
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(viewTapped:)];
[self addGestureRecognizer:[tap autorelease]];
然后,在viewTapped:
内部
-(void)viewTapped:(id)sender
[self.yourTextField becomeFirstResponder];
希望这会有所帮助!
【讨论】:
感谢您的建议。是否可以将该点击区域限制为自定义 UIView 而不是整个窗口?我同时在屏幕上有多个这样的视图。 是的,这就是我所说的...您可以在视图中添加一个轻击手势识别器,其中一个包含标签和文本视图。与其他答案不同,如果您将点击手势添加到自定义视图,即使用户在标签外部但在自定义视图内点击,textView 也将允许输入。 如果将 UITapGestureRecognizer 添加到 self 而不是 UILabel,则设备窗口内的任何点击都将聚焦到文本字段。这不是我所追求的行为。 不,我指的不是应用程序的窗口。在这种情况下,'self' 指的是自定义视图。我在发布之前测试了答案,效果很好。【参考方案3】:您可以定义UIGestureRecognizer
委托方法并检查这是所需的点击手势区域。如果是则返回 TRUE 否则返回 FALSE 。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
// Disallow recognition of tap gestures in the segmented control.
if ((touch.view == yourButton)) //change it to your condition
return NO;
return YES;
【讨论】:
touch.view == yourButton 比较的是指针而不是对象。你的意思是 isEqual: function以上是关于如何告诉带有 UITextField 的自定义 UIView 接收触摸事件的主要内容,如果未能解决你的问题,请参考以下文章
如何在 XIB 中调用 UITextField 的委托方法?
iOS:如何从 tableview 的自定义单元格中的 UITextField 访问值
如何在Swift 3中修复我的自定义UITextField对象?
如何使用 @IBDesignable 和 @IBInspectable 制作 uitextfield 的自定义子类并在那里我可以从左侧设置占位符填充