代码之家  ›  专栏  ›  技术社区  ›  TheRedCamaro3.0 3.0

如何使键盘出现并在点击视图时开始编辑文本字段

  •  -1
  • TheRedCamaro3.0 3.0  · 技术社区  · 7 年前

    我正在尝试这样做,当用户触摸 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 回复  |  直到 7 年前
        1
  •  2
  •   rmaddy    7 年前

    你不想做 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()
            }
        }
    

    也, 搜索条 不是一个 UITextField .

    不需要 viewTapped 成为一种财产。使其成为局部变量。

    不需要 isKeyboardShowing 属性。

    推荐文章