Mengapa pengamat onKeyboardDisplayed dipanggil sebelum textViewDidBeginEditing

Dec 23 2020

Aplikasi saya dengan cepat. Saat saya mengedit UITextField, terkadang keyboard menyembunyikan bidang tersebut. Jadi saya menggunakan textFieldDidBeginEditing delegasi untuk menetapkan "activeTextField" (dan textFieldDidEndEditing untuk mengatur ulang ke nihil). Kemudian pada viewDidLoad saya menambahkan pengamat yang ditautkan ke fungsi onKeyboardDisplayed di mana saya menguji nilai "activeTextField" sehingga saya dapat menggesek layar ke atas jika diperlukan. Dan itu bekerja dengan baik :)

Hal baru yang buruk adalah saya mencoba melakukan hal yang sama untuk UITextView, menggunakan textViewDidBeginEditing delegasi untuk menetapkan "activeTextView". Tetapi tidak seperti UITextField, delegasi dipanggil setelah onKeyboardDisplayed sehingga keyboard masih menyembunyikan UITextView saya.

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)
        }
    }
}

Apakah Anda tahu cara untuk memperbaikinya?

Jawaban

2 syntiz Dec 23 2020 at 20:36

Akhirnya saya menemukan solusi di sini: Acara keyboard yang dipanggil sebelum acara delegasi UITextView

Saya mengubah keyboardWillShowNotification

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

oleh keyboardDidShowNotification

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

Dan sekarang berfungsi dengan baik: fungsi onKeyboardDisplayed saya dipanggil setelah textViewDidBeginEditing delegasi

1 LucaSfragara Dec 23 2020 at 18:54

Cara standar untuk menangani kemunculan keyboard adalah ini

Di ViewController Anda:

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
}

Ini menggerakkan bingkai tampilan ke atas dan ke bawah sesuai dengan ketinggian keyboard. Jika saya memahami pertanyaan Anda dengan benar, saya yakin ini dapat membantu Anda