iOS - Отключить клавиатуру при касании за пределами UITextField - PullRequest
440 голосов
/ 15 марта 2011

Мне интересно, как заставить клавиатуру исчезать, когда пользователь прикасается к внешней стороне UITextField.

Ответы [ 35 ]

1 голос
/ 04 июня 2016

В этом случае можно использовать ScrollView и добавить к TextField в ScrollView, и я хочу нажать ScrollView и просмотреть, а затем закрыть клавиатуру. Я попытался создать пример кода на всякий случай. Вот так

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var scrollView: UIScrollView!
    @IBOutlet weak var textField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.tap(_:)))
        view.addGestureRecognizer(tapGesture)
        // Do any additional setup after loading the view, typically from a nib.
    }
    func tap(gesture: UITapGestureRecognizer) {
        textField.resignFirstResponder()
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

Ваш Раскадровка Посмотрите на это точно так же.

enter image description here

0 голосов
/ 30 марта 2019

В viewDidLoad swift 4.2 код такой

let viewTap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action:#selector(dismissKeyboard))
        view.addGestureRecognizer(viewTap)
@objc func dismissKeyboard() {
        view.endEditing(true)
    }
0 голосов
/ 30 июня 2015

просто используйте этот код в вашем файле .m, он уйдет в текстовое поле, когда пользователь нажмет за пределы текстового поля.

 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
  [textfield resignFirstResponder];
 }
0 голосов
/ 01 августа 2015
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
    super.view.endEditing(true)
    super.touchesBegan(touches, withEvent: event)
}
0 голосов
/ 09 марта 2016

Так что мне просто нужно было решить эту самую проблему, и ни один из предыдущих ответов не работал для меня из коробки.Моя ситуация: UISearchBar, плюс ряд других элементов управления на экране.Я хочу, чтобы нажатие за пределами панели поиска закрывало клавиатуру, но , а не , распространяется на другие элементы управления.Когда клавиатура скрыта, я хочу, чтобы все элементы управления работали.

Что я сделал:

1) Реализовал собственный обработчик касаний в моем контроллере вида.

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?)
{
    if searchBar.isFirstResponder()
    {
        // This causes the first responder, whoever it is, to resign first responder, and hide the keyboard.
        // We also "eat" the touch here and not allow it to propagate further.
        view.endEditing(true)
    }
    else
    {
        // OK to propagate the touch
        super.touchesBegan(touches, withEvent: event)
    }
}

2) Добавлена ​​пара методов делегатов (мой для UISearchBar, но есть аналогичные для UITextField).controlContainerView в приведенном ниже коде - это UIView, в котором есть несколько кнопок.Помните, что установка userInteractionEnabled в суперпредставлении отключает все его подпредставления.

 func searchBarTextDidBeginEditing(searchBar: UISearchBar)
 {
     controlContainerView.userInteractionEnabled = false
     someButton.userInteractionEnabled = false
 }

 func searchBarTextDidEndEditing(searchBar: UISearchBar)
 {
     searchBar.resignFirstResponder()

    // Done editing: enable the other controls again.

    controlContainerView.userInteractionEnabled = false
    someButton.userInteractionEnabled = false
}
...