Suppression de la barre d'access WKWebView dans Swift

J'essaye depuis quelques jours maintenant de le convertir en Swift sans vraiment avoir beaucoup d'expérience en la matière.

C'est ce que j'ai jusqu'ici … et j'ai cherché sur google ne sachant pas vraiment quoi chercher pour être plus précis. Pouvez-vous s'il vous plaît faire la lumière sur ce que je fais mal? Merci

Mise à jour :

J'ai ajouté la balise objective-c juste pour que plus de personnes liées à ce sujet puissent voir et get une réponse.

entrez la description de l'image ici

La réponse de Michael Dautermann a tout compris, mais pour masquer la barre d'accessoires, vous devez balayer la méthode inputAccessoryView () de UIView Class avec inputAccessoryView () de la class _NoInputAccessoryView. Je viens d'append le couple de lignes supplémentaires au code qui fait ce travail de méthode swizzling.

D'abord, vous aurez besoin d'une fausse class à échanger avec

final class FauxBarHelper: NSObject { var inputAccessoryView: AnyObject? { return nil } } 

Puis créez cette méthode dans votre class de controller

 /// Removes the keyboard accessory view from the web view /// Source: http://stackoverflow.com/a/32620344/308315 / http://stackoverflow.com/a/33939584/308315 func _removeInputAccessoryView(webView: UIWebView) { var targetView: UIView? = nil for view in webView.scrollView.subviews { if Ssortingng(describing: type(of: view)).hasPrefix("WKContent") { targetView = view } } guard let target = targetView else { return } let noInputAccessoryViewClassName = "\(target.superclass!)_NoInputAccessoryView" var newClass: AnyClass? = NSClassFromSsortingng(noInputAccessoryViewClassName) if newClass == nil { let targetClass: AnyClass = object_getClass(target) newClass = objc_allocateClassPair(targetClass, noInputAccessoryViewClassName.cSsortingng(using: Ssortingng.Encoding.ascii)!, 0) } let originalMethod = class_getInstanceMethod(FauxBarHelper.self, #selector(getter: FauxBarHelper.inputAccessoryView)) class_addMethod(newClass!.self, #selector(getter: FauxBarHelper.inputAccessoryView), method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)) object_setClass(target, newClass) } 

HTH;)

Cet extrait de code devrait vous permettre de résoudre votre problème:

 class _NoInputAccessoryView: NSObject { func removeInputAccessoryViewFromWKWebView(webView: WKWebView) { // make sure to make UIView an optional here... var targetView: UIView? = nil for view in webView.scrollView.subviews { if Ssortingng(view.dynamicType).hasPrefix("WKContent") { targetView = view } } // only optionals can be nil if targetView == nil { return } let noInputAccessoryViewClassName = "\(targetView!.superclass)_NoInputAccessoryView" var newClass : AnyObject? = NSClassFromSsortingng(noInputAccessoryViewClassName) if newClass == nil { let uiViewClass : AnyClass = object_getClass(targetView!) newClass = objc_allocateClassPair(uiViewClass, noInputAccessoryViewClassName.cSsortingngUsingEncoding(NSASCIISsortingngEncoding)!, 0) } } 

Vous pouvez également utiliser " Ssortingng(view.dynamicType) " pour get le nom de la class de l'object que vous regardez, comme je l'ai remarqué dans cette réponse alors que je recherchais la façon de résoudre votre problème .

Utiliser hasPrefix comme ça dans Objective-C et Swift est vraiment hacky et peut-être une meilleure façon de cacher le keyboard pourrait être trouvée pour le code de production?

Voici une version légèrement plus sûre (pas de déballage dangereux) qui fonctionne avec Swift 4 et iOS 9-11.

 fileprivate final class InputAccessoryHackHelper: NSObject { @objc var inputAccessoryView: AnyObject? { return nil } } extension WKWebView { func hack_removeInputAccesory() { guard let target = scrollView.subviews.first(where: { Ssortingng(describing: type(of: $0)).hasPrefix("WKContent") }), let superclass = target.superclass else { return } let noInputAccessoryViewClassName = "\(superclass)_NoInputAccessoryView" var newClass: AnyClass? = NSClassFromSsortingng(noInputAccessoryViewClassName) if newClass == nil, let targetClass = object_getClass(target), let classNameCSsortingng = noInputAccessoryViewClassName.cSsortingng(using: .ascii) { newClass = objc_allocateClassPair(targetClass, classNameCSsortingng, 0) if let newClass = newClass { objc_registerClassPair(newClass) } } guard let noInputAccessoryClass = newClass, let originalMethod = class_getInstanceMethod(InputAccessoryHackHelper.self, #selector(getter: InputAccessoryHackHelper.inputAccessoryView)) else { return } class_addMethod(noInputAccessoryClass.self, #selector(getter: InputAccessoryHackHelper.inputAccessoryView), method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)) object_setClass(target, noInputAccessoryClass) } }