Вы не хотите, чтобы 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
.