it-swarm.com.ru

Как отклонить клавиатуру при касании где-нибудь за пределами UITextField (в Swift)?

Я работаю над проектом, который имеет UIViewController, на контроллере представления есть UIScrollView и UITextField на scrollview . Как это:   Я пытаюсь закрыть клавиатуру и спрятать ее после ввода текста в текстовое поле и нажатия в любом месте за пределами текстового поля . Я пробовал следующий код:

override func viewDidLoad() {
    super.viewDidLoad()
    self.textField.delegate = self;
}

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    self.view.endEditing(true)
}

Это работает для меня, когда я нажимаю вне вида прокрутки, но когда я нажимаю на вид прокрутки, ничего не происходит, и клавиатура не скрывается.

Есть ли способ отклонить клавиатуру при нажатии where за пределами текстового поля? Спасибо

53
White Hat

Отредактировано для Swift 4

Правка: Добавлено @objc. Хотя это не лучший вариант для повышения производительности, один его пример не должен вызывать слишком много проблем, пока не будет найдено лучшее решение.

Отредактировано, чтобы исправить, когда нужно взаимодействовать с элементами позади GestureRecognizer.

Правка: Спасибо @Rao за указание на это. Добавлен tap.cancelsTouchesInView = false.

Это должно помочь вам иметь несколько UITextView или UITextField

Создайте расширение контроллера представления. Это сработало для меня гораздо проще и с меньшими хлопотами, чем при использовании .resignFirstResponder()

extension UIViewController
{
    func hideKeyboard()
    {
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(
            target: self,
            action: #selector(UIViewController.dismissKeyboard))

        tap.cancelsTouchesInView = false
        view.addGestureRecognizer(tap)
    }

    @objc func dismissKeyboard()
    {
        view.endEditing(true)
    }
}

Вызовите self.hideKeyboard() в viewDidLoad

98
Matthew Bradshaw

Попробуйте это, это проверено и работает:

Для Swift 3.0/4.0

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    self.view.endEditing(true)
}

Для старых Свифт  

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent) {
    self.view.endEditing(true)
}
55
iAnurag

В этом случае UITapGesture является одним из вариантов. Я попытался создать пример кода на всякий случай. Как это,

class ViewController: UIViewController {

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

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        let tapGesture = UITapGestureRecognizer(target: self, action: "tap:")
        view.addGestureRecognizer(tapGesture)
    }

    func tap(gesture: UITapGestureRecognizer) {
        textField.resignFirstResponder()
    }
}
13
pixyzehn

Свифт 3

override func viewDidLoad() {
    super.viewDidLoad()
    self.view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:))))
}
13
Giang

Рабочее решение для Swift 3, работающее с ScrollView

class ViewController: UIViewController {

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

    override func viewDidLoad() {
        super.viewDidLoad()

        // The next line is the crucial part
        // The action is where Swift 3 varies from previous versions
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.tap(gesture:)))
        self.view.addGestureRecognizer(tapGesture)
    }

    func tap(gesture: UITapGestureRecognizer) {
        textField.resignFirstResponder()
    }
}

Другой вопрос который говорит об этой проблеме, на которую я ссылался и использовал. Принятый ответ больше не работает в Swift 3. Текущий выбранный ответ должен быть ответом ниже.

11
Devbot10

Подробности

xCode 8.2.1, Swift 3

Задача

Установите UITapGestureRecognizer для представления UIViewController, который закроет клавиатуру и сделает эту функцию как свойство Bool UIView.

Комплексная реализация, но использование в одной строке

класс TapGestureRecognizer

import UIKit

class TapGestureRecognizer: UITapGestureRecognizer {

    let identifier: String

    private override init(target: Any?, action: Selector?) {
        self.identifier = ""
        super.init(target: target, action: action)
    }

    init(target: Any?, action: Selector?, identifier: String) {
        self.identifier = identifier
        super.init(target: target, action: action)
    }

    static func == (left: TapGestureRecognizer, right: TapGestureRecognizer) -> Bool {
        return left.identifier == right.identifier
    }
}

расширение UIView

import UIKit

extension UIView {

    private var disableKeybordWhenTappedGestureRecognizerIdentifier:String {
        return "disableKeybordWhenTapped"
    }

    private var disableKeybordWhenTappedGestureRecognizer: TapGestureRecognizer? {

        let hideKeyboardGesture = TapGestureRecognizer(target: self, action: #selector(UIView.hideKeyboard), identifier: disableKeybordWhenTappedGestureRecognizerIdentifier)

        if let gestureRecognizers = self.gestureRecognizers {
            for gestureRecognizer in gestureRecognizers {
                if let tapGestureRecognizer = gestureRecognizer as? TapGestureRecognizer, tapGestureRecognizer == hideKeyboardGesture, tapGestureRecognizer == hideKeyboardGesture {
                    return tapGestureRecognizer
                }
            }
        }
        return nil
    }

    @objc private func hideKeyboard() {
        endEditing(true)
    }

    var disableKeybordWhenTapped: Bool {

        set {
            let hideKeyboardGesture = TapGestureRecognizer(target: self, action: #selector(UIView.hideKeyboard), identifier: disableKeybordWhenTappedGestureRecognizerIdentifier)

            if let disableKeybordWhenTappedGestureRecognizer = self.disableKeybordWhenTappedGestureRecognizer {
                removeGestureRecognizer(disableKeybordWhenTappedGestureRecognizer)
                if gestureRecognizers?.count == 0 {
                    gestureRecognizers = nil
                }
            }

            if newValue {
                addGestureRecognizer(hideKeyboardGesture)
            }
        }

        get {
            return disableKeybordWhenTappedGestureRecognizer == nil ? false : true
        }
    }
}

Использование

view.disableKeybordWhenTapped = true

Полный образец

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let textField = UITextField(frame: CGRect(x: 50, y: 50, width: 200, height: 30))
        textField.borderStyle = .roundedRect
        textField.placeholder = "Enter text"
        view.addSubview(textField)

        view.disableKeybordWhenTapped = true
    }
}
5
Vasily Bodnarchuk

Проверь это.

override func viewDidLoad() {
    var tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.handleTap))
    self.view.userInteractionEnabled = true
    self.view.addGestureRecognizer(tapGesture)
}

Тогда ваш обработчик крана есть.

  func handleTap(sender: UITapGestureRecognizer) {
    self.view.endEditing(true)
}
5
handiansom

Для Swift 3

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    self.view.endEditing(true)
}
3
Davina Arnold

Это работает при касании за пределами области ввода для любого количества элементов ввода.

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        self.view.endEditing(true)
    }
2
Venkat Ram

Каждое прикосновение отличается от текстовое поле отклонить клавиатуру или использовать resignfirstresponder

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
 UITouch *touch = [touches anyObject];
 if(![touch.view isMemberOfClass:[UITextField class]]) {
     [touch.view endEditing:YES];
 }
}
1
Miguel Monteiro

У меня была такая же проблема, и я наконец решил ее!

Установите TapGestureRecognizer на вашей раскадровке, а затем на выходе в вашем ViewController

@IBOutlet var tapGesture: UITapGestureRecognizer!

Затем установите IBAction в вашем ViewController

@IBAction func DismissKeyboard(sender: UITapGestureRecognizer)
{
 self.view.endEditing(true)
} 

добавьте эти строки в ваш метод viewDidLoad

override func viewDidLoad()
{
    super.viewDidLoad()
    self.view.addGestureRecognizer(tapGesture)
}

и это должно работать

Надеюсь, что это поможет!

1
Lynkz7
func findAndResignFirstResponder(_ stView: UIView) -> Bool {

    if stView.isFirstResponder {
        stView.resignFirstResponder()
        return true
    }
    for subView: UIView in stView.subviews {
        if findAndResignFirstResponder(subView) {
            return true
        }
    }
    return false
}
1
Subhajit

Перейдите к типу клавиатуры и выберите «По умолчанию» или любой другой, для которого вам нужно TextField. Затем переопределите метод, вызывайте его как хотите, я обычно называю его TouchBegins. Ниже то, что вы забыли добавить

super.touchingBegins(touches, withEvent: event)
 }
0
Katz

Я создал этот метод в Obj-C, который скрывает клавиатуру независимо от того, где пользователь в данный момент печатает:

//call this method
+ (void)hideKeyboard {
    //grab the main window of the application
    UIWindow *window = [UIApplication sharedApplication].keyWindow;
    //call our recursive method below
    [self resignResponderForView:window];
}

//our recursive method
+ (void)resignResponderForView:(UIView *)view {
    //resign responder from this view
    //If it has the keyboard, then it will hide the keyboard
    [view resignFirstResponder];
    //if it has no subviews, then return back up the stack
    if (view.subviews.count == 0)
        return;
    //go through all of its subviews
    for (UIView *subview in view.subviews) {
        //recursively call the method on those subviews
        [self resignResponderForView:subview];
    }
}

Я надеюсь, что это переводится на Swift и имеет смысл. Он может быть вызван в любом месте приложения и будет скрывать клавиатуру независимо от того, на каком VC вы находитесь или что-либо еще.

0
AlexKoren

Представьте распознаватель жестов касания и настройте его. 

Используйте код:

имя вашего текстового поля . resignfirstresponder ()

0
kuni

В Swift4

 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
            self.view.endEditing(true)
        }
0
Raghib Arshi

// В Swift 4.. У меня сработало.

func setupKeyboardDismissRecognizer(){
    let tapRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(searchingActivity.dismissKeyboard))

    self.view.addGestureRecognizer(tapRecognizer)
}

    @objc func dismissKeyboard()
    {
        view.endEditing(true)
        searchTableView.isHidden = true
    }

// Вызываем эту функцию setupKeyboardDismissRecognizer () в viewDidLoad

0
Raghib Arshi