Warum der Beobachter onKeyboardDisplayed vor textViewDidBeginEditing aufgerufen wird

Dec 23 2020

Meine App ist schnell. Wenn ich ein UITextField bearbeite, verbirgt manchmal die Tastatur das Feld. Daher verwende ich den Delegaten textFieldDidBeginEditing, um ein "activeTextField" festzulegen (und textFieldDidEndEditing, um es auf null zurückzusetzen). Dann füge ich in viewDidLoad einen Beobachter hinzu, der mit einer onKeyboardDisplayed-Funktion verknüpft ist, in der ich den Wert von "activeTextField" teste, damit ich den Bildschirm bei Bedarf nach oben wischen kann. Und es funktioniert gut :)

Das schlechte Neue ist, dass ich versucht habe, dasselbe für eine UITextView zu tun, indem ich den Delegaten textViewDidBeginEditing verwendet habe, um eine "activeTextView" festzulegen. Im Gegensatz zu UITextField wird der Delegat jedoch nach onKeyboardDisplayed aufgerufen, sodass die Tastatur meine UITextView weiterhin verbirgt.

NotificationCenter.default.addObserver(self, selector: #selector(onKeyboardDisplayed(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil)

@objc func onKeyboardDisplayed(notification: Notification) {
    guard let keyboardRect = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else {
        return
    }
    var visibleRect : CGRect = self.view.frame
    visibleRect.size.height -= keyboardRect.height
    if (activeTextField != nil) {
        // Get y position of active textField bottom.
        let textFieldBottomPosition = activeTextField!.convert(CGPoint.zero, to: nil).y + activeTextField!.frame.height
        if(textFieldBottomPosition > visibleRect.size.height) {
            // swipe up
            view.frame.origin.y = (visibleRect.size.height - textFieldBottomPosition - 6)
        }
    }
    if (activeTextView != nil) {
        // Get y position of active textView bottom.
        let textViewBottomPosition = activeTextView!.convert(CGPoint.zero, to: nil).y + activeTextView!.frame.height
        if(textViewBottomPosition > visibleRect.size.height) {
            // swipe up
            view.frame.origin.y = (visibleRect.size.height - textViewBottomPosition - 6)
        }
    }
}

Kennen Sie einen Weg, das zu beheben?

Antworten

2 syntiz Dec 23 2020 at 20:36

Schließlich habe ich hier eine Lösung gefunden: Tastaturereignisse, die vor UITextView-Delegatereignissen aufgerufen wurden

Ich habe keyboardWillShowNotification geändert

NotificationCenter.default.addObserver(self, selector: #selector(onKeyboardDisplayed(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil)

von keyboardDidShowNotification

NotificationCenter.default.addObserver(self, selector: #selector(onKeyboardDisplayed(notification:)), name: UIResponder.keyboardDidShowNotification, object: nil)

Und jetzt funktioniert es gut: Meine Funktion onKeyboardDisplayed wird nach dem Delegaten textViewDidBeginEditing aufgerufen

1 LucaSfragara Dec 23 2020 at 18:54

Die Standardmethode für den Umgang mit der Tastatur ist die folgende

In Ihrem ViewController:

override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(self, selector: #selector(handleKeyboardWillShow), name: UIControl.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(handleKeyboardWillHide), name: UIControl.keyboardWillHideNotification, object: nil)
 }

 @objc private func handleKeyboardWillShow(notification: NSNotification){
    
    guard let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else{
        return
    }
    self.view.frame.origin.y -= keyboardSize.height
}

@objc private func handleKeyboardWillHide(notification: NSNotification){
    self.view.frame.origin.y = 0
}

Dadurch wird der Ansichtsrahmen entsprechend der Höhe der Tastatur auf und ab bewegt. Wenn ich Ihre Frage richtig verstehe, glaube ich, dass dies Ihnen helfen kann