当用户在文本框外的其他区域点击时,如何关闭键盘?

52

今天我尝试在我的iPod(iOS 6.1.3)上运行我的代码,发现了一些有趣的东西...

首先,当我点击文本框时,键盘会弹出,但是当我在文本框外部的其他地方点击时,它不会隐藏。

因此,我决定搜索并找到了这个解决方案:

_fieldEmail.delegate = self;
_fieldEmail.returnKeyType = UIReturnKeyDone;

_fieldPassword.delegate = self;
_fieldPassword.returnKeyType = UIReturnKeyDone;

_fieldRegisterName.delegate = self;
_fieldRegisterName.returnKeyType = UIReturnKeyDone;

_fieldRegisterEmail.delegate = self;
_fieldRegisterEmail.returnKeyType = UIReturnKeyDone;

_fieldRegisterPassword.delegate = self;
_fieldRegisterPassword.returnKeyType = UIReturnKeyDone;

它可以运行... 它在键盘底部提供了一个“完成”按钮,现在可以通过按下该按钮来隐藏键盘。

但是我这里有两个问题:

  1. 只有在点击“完成”按钮时键盘才会隐藏,而不是在文本字段之外的其他区域点击。我不知道这在iOS世界中是否正常,但通常我看到很多应用程序不会这样做。
  2. 有没有办法循环执行此过程,以便我不必手动添加所有文本字段的委托?如何做到这一点?

这就是我需要知道的全部内容。


这里有一些很好的答案。 - ICL1901
可能是重复的问题:iphone,当触摸文本字段外部时关闭键盘 - icodebuster
15个回答

1

我更喜欢使用IQKeyboardManager。你可以在任何状态下轻松处理键盘。要激活IQKeyboard,只需在AppDelegate中添加一行代码,并添加以下代码以在外部触摸时关闭键盘:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

  IQKeyboardManager.shared.enable = true
  IQKeyboardManager.shared.shouldResignOnTouchOutside = true

  return true
}

0

我认为

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

直接使用是方便但并非最佳解决方案。 TapGestureRecongnizer更好但使用起来比较困难,你需要设置代理并添加和删除Recongnizer。 因此,我编写了一个简单的子类,可以轻松使用:

class TapHideTextField: UITextField {
override func awakeFromNib() {
    super.awakeFromNib()
    tapGr = UITapGestureRecognizer(target: self, action:"tap")
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "didBeginEditing", name:UITextFieldTextDidBeginEditingNotification, object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "didEndEditing", name:UITextFieldTextDidEndEditingNotification, object: nil)

}

deinit{
    NSNotificationCenter.defaultCenter().removeObserver(self)
}

var tapGr:UITapGestureRecognizer!
func tap(){
    self.endEditing(true)
}

func didBeginEditing(){
    self.superview!.addGestureRecognizer(tapGr)
}


func didEndEditing(){
    self.superview!.removeGestureRecognizer(tapGr)
}

}

你应该关注superview和cancelTouchesInView属性。
或者在GitHub上:https://github.com/lilidan/TapHideText/blob/master/TapHideTextField.swift

0
如果你正在使用滚动视图(或表格视图)控制器,请在那里添加这些行代码:
    override func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
        view.endEditing(true)
    }

-1
-(void) textFieldDidBeginEditing: (UITextField *) textField{
     [self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(DismissKeyboard:)]];
}

-(void) DismissKeyboard:(UITapGestureRecognizer *) sender{
    [self.view endEditing:YES];
    [self.view removeGestureRecognizer:sender];
}

即使视图上有控件,这也肯定会起作用。 - jaya raj

-1

对于任何可能有所帮助的人,这里有一个在Swift 5中解决此问题的非常简单的方法

  1. 从Main Storyboard向您的视图添加一个轻拍手势识别器。
  2. 在您的ViewController文件中创建一个@IBAction。
  3. 在@IBAction内部关闭键盘(或执行其他操作)

将“UITextField”替换为要从中关闭键盘的文本字段的名称

    //dismiss the keyboard 
    @IBAction func userTapped(_ sender: UITapGestureRecognizer) {
        UITextField.resignFirstResponder()
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接