Как сделать так, чтобы клавиатура появлялась, и текстовое поле начиналось редактировать при касании вида - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь сделать так, чтобы, когда пользователь касается UIView, появлялась клавиатура, и пользователь мог вводить текстовое поле.Я не могу сделать вид первым респондентом, как я могу сделать это возможным?

Ниже приведен код:

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet weak var searchBar: UITextField!
    var isKeyboardShowing:Bool = true
    var viewTapped:UITapGestureRecognizer = UITapGestureRecognizer()

    override func viewDidLoad() {
        super.viewDidLoad()
        searchBar.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -500).isActive = true
        viewTapped = UITapGestureRecognizer(target: self, action: #selector(viewWasTapped))
        self.view.addGestureRecognizer(viewTapped)


        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: .UIKeyboardWillShow, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
        searchBar.delegate = self
    }

    override func viewWillAppear(_ animated: Bool) {
        self.searchBar.resignFirstResponder()
        self.view.becomeFirstResponder()
        print("Can the view be the first responder: \(self.view.canBecomeFirstResponder)")
        print("the searchbar is the first responder: \(searchBar.isFirstResponder)")
        print("the view is the first responder: \(self.view.isFirstResponder)")
    }

    @objc func viewWasTapped(){
    print("The view was tapped")
        if isKeyboardShowing{
            view.endEditing(true)
        }
        else{

        }
    }

    @objc func keyboardWillShow(notification: NSNotification) {
        print("keyboardWillShow")
    }

    @objc func keyboardWillHide(notification: NSNotification){
        print("keyboardWillHide")
    }

}

1 Ответ

0 голосов
/ 29 мая 2018

Вы не хотите, чтобы self.view первым отвечал.Вы хотите сделать searchBar первым респондентом.

И нет никакой причины звонить resignFirstResponder в одном представлении, если вы собираетесь звонить becomeFirstResponder в другом представлении.

class ViewController: UIViewController, UITextFieldDelegate {
    @IBOutlet weak var searchBar: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        searchBar.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -500).isActive = true
        searchBar.delegate = self

        let viewTapped = UITapGestureRecognizer(target: self, action: #selector(viewWasTapped))
        self.view.addGestureRecognizer(viewTapped)

        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: .UIKeyboardWillShow, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
    }

    override func viewWillAppear(_ animated: Bool) {
        searchBar.becomeFirstResponder()

        print("Can the view be the first responder: \(self.view.canBecomeFirstResponder)")
        print("the searchbar is the first responder: \(searchBar.isFirstResponder)")
        print("the view is the first responder: \(self.view.isFirstResponder)")
    }

    @objc func viewWasTapped(){
        print("The view was tapped")
        if searchBar.isFirstResponder {
            searchBar.resignFirstResponder()
        } else{
            searchBar.becomeFirstResponder()
        }
    }

Кроме того, searchBar не лучшее имя для UITextField.

Нет необходимости для viewTapped быть свойством.Сделайте его локальной переменной.

Нет необходимости в свойстве isKeyboardShowing.

...