如何告诉带有 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对象?

带有底部边框的自定义 UITextView

如何使用 @IBDesignable 和 @IBInspectable 制作 uitextfield 的自定义子类并在那里我可以从左侧设置占位符填充

带有 UITextFields 和 UITextViews 的自定义 UIAlertView