Benachrichtigung beim Anzeigen der virtuellen Tastatur

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Benachrichtigung beim Anzeigen der virtuellen Tastatur

    Mit folgenden Observern lasse ich mich über das ein- und ausblenden der virtuellen Tastatur benachrichtigen:

    Quellcode

    1. NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    2. NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
    Die Benachrichtigung benötige ich in einem WKWebView mit verschiedenen Formularen, wo ich in meiner UI einen zusätzlichen Bereich einblenden will, wenn man in einem Textfeld ist und die virtuelle Tastatur eingeblendet wird.

    Mein Problem ist nun, dass UIKeyboardWillShow und UIKeyboardDidShow schon gefeuert werden, wenn man in den WKWebView nur irgendwo auf einen leeren Bereich klickt. Die Tastatur erscheint zwar nicht aber der Observer wird informiert, dass das Keyboard angezeigt wird.

    Noch komischer ist es bei SELECT-Feldern. Klickt man eins an, wird UIKeyboardWillShow aufgerufen. Klickt man dann auf einen leeren Bereich, wird UIKeyboardWillHide gesendet. Wählt man dagegen eine Option aus, wird nichts mehr gesendet. Die Tastatur wird in allen Fällen jedoch nicht angezeigt.

    Ist das ein Bug in Verbindung mit WKWebView oder hat jemand eine Erklärung für dieses Verhalten? Kenn jemand eine Lösung oder einen anderen Weg, wie ich genau ermitteln kann, ob momentan das Keyboard angezeigt wird oder nicht?

    iOS 11
    Xcode 9
    getesten im Simulator und auf dem iPad

    Gruß
    So Long, and Thanks for All the Fish.
  • Ok, das Problem tritt zusammen mit folgendem Code auf, den ich im Internet gefunden habe, um bei einer WKWebView den InputAccessoryView zu setzen:

    Quellcode

    1. import Foundation
    2. import WebKit
    3. private var ViewHandle: UInt8 = 0
    4. extension WKWebView {
    5. func addCustomInputAccessoryView(_ view: UIView?) {
    6. guard let view = view else { return }
    7. objc_setAssociatedObject(self, &ViewHandle, view, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
    8. var candidateView: UIView? = nil
    9. for view in self.scrollView.subviews {
    10. if String(describing: type(of: view)).hasPrefix("WKContent") {
    11. candidateView = view
    12. }
    13. }
    14. guard let targetView = candidateView else { return }
    15. let newClass: AnyClass? = self.classWithCustomAccessoryView(targetView)
    16. object_setClass(targetView, newClass!)
    17. }
    18. private func classWithCustomAccessoryView(_ targetView: UIView) -> AnyClass? {
    19. guard let targetSuperClass = targetView.superclass else { return nil }
    20. let customInputAccessoryViewClassName = "\(targetSuperClass)_CustomInputAccessoryView"
    21. var newClass: AnyClass? = NSClassFromString(customInputAccessoryViewClassName)
    22. if newClass == nil {
    23. newClass = objc_allocateClassPair(object_getClass(targetView), customInputAccessoryViewClassName, 0)
    24. let newMethod = class_getInstanceMethod(WKWebView.self, #selector(WKWebView.getCustomInputAccessoryView))
    25. class_addMethod(newClass!.self, #selector(getter: UIResponder.inputAccessoryView), method_getImplementation(newMethod!), method_getTypeEncoding(newMethod!))
    26. objc_registerClassPair(newClass!)
    27. }
    28. return newClass
    29. }
    30. @objc func getCustomInputAccessoryView() -> UIView? {
    31. var superWebView: UIView? = self
    32. while (superWebView != nil) && !(superWebView is WKWebView) {
    33. superWebView = superWebView?.superview
    34. }
    35. let customInputAccessory = objc_getAssociatedObject(superWebView, &ViewHandle)
    36. return customInputAccessory as? UIView
    37. }
    38. }
    Alles anzeigen
    Wenn ich den InputAccessoryView nicht setze, werden auch nicht die falschen Benachrichtigungen gesendet. Ich brauche aber die Benachrichtigungen, um den InputAccessoryView wieder auszublenden, da er ansonsten nach dem Verschwinden der Tastatur unten kleben bleibt.

    Hat jemand evtl. einen andere Idee, wie ich die Tastatur in einer WKWebView um eine zusätzliche Leiste erweitern kann?
    So Long, and Thanks for All the Fish.