当在视图之外点击时,让 UIView 辞职第一响应者

Posted

技术标签:

【中文标题】当在视图之外点击时,让 UIView 辞职第一响应者【英文标题】:Make UIView resign first responder when tapped outside of view 【发布时间】:2010-08-07 16:35:14 【问题描述】:

当用户在视图边界之外点击时,有什么方法可以让 UIView 放弃其第一响应者状态?

【问题讨论】:

【参考方案1】:

在另一个或多个视图中捕获触摸。处理该触摸时,调用一个选择器,让您的视图放弃其响应者状态。

【讨论】:

【参考方案2】:

在做研究时找到了更好的答案...

Get the current first responder without using a private API

有关于如何导航视图以找到第一响应者的示例代码,可用作您解决方案的基础

您可以先放置一个透明视图,然后再放置一个子视图。然后可以使用透明视图中的任何触摸事件来让第一响应者辞职。

如果在要管理的主视图边界之外有多个视图,这可能是一种方法

【讨论】:

【参考方案3】:

这很简单,需要分两个步骤来介绍:

    添加手势识别器以捕捉视图点击 辞去第一响应者的职务

感谢@Nathan Eror 提供first part。我们可以在 viewDidLoad 方法中添加手势识别器,以便在用户点击屏幕时进行注册:

UITapGestureRecognizer *singleFingerTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
[self.view addGestureRecognizer:singleFingerTap];

接下来我们将添加检测这一点的函数和移除键盘的代码:

- (void)handleSingleTap:(UITapGestureRecognizer *)recognizer 
CGPoint location = [recognizer locationInView:[recognizer.view superview]];

    [textField resignFirstResponder];

值得注意的是,如果您的视图中有多个文本字段,则需要将它们全部退出,因为无法通过触摸知道哪个是当前的第一响应者。

【讨论】:

【参考方案4】:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    [yourtextfield resignFirstResponder];
    //You can have multiple textfields in here

【讨论】:

能否请您至少大致解释一下您的答案? 当用户触摸屏幕时,此委托方法将调用,因为这是 UIViewController 类的子类 viewcontroller 类。因此,在调用此方法时,我们调用 UITextField 委托方法“resignFirstResponder”。跨度>

以上是关于当在视图之外点击时,让 UIView 辞职第一响应者的主要内容,如果未能解决你的问题,请参考以下文章

UITextField,辞职第一响应者时,导致文本的奇怪动画滚动

从单独的班级辞职第一响应者

iPhone-在 UITextField 上辞职第一响应者后,无法重新聚焦

使用 UINavigationController 时在 didSelectRowAtIndexPath 中辞职第一响应者

让超出父视图范围的子视图响应事件,在UIView范围外响应点击

iOS:响应者辞职时,文本从子类 UITextfield 中消失