在Swift中删除WKWebView附件栏

我正在尝试几天,把它转换成Swift,没有太多的背景。

这是我迄今为止…而我一直在寻找谷歌不知道要search什么,才能更具体。 你能说清楚我做错了什么吗? 谢谢

更新

我已经提供了Objective-C标签,让更多与此主题相关的人可以看到它,并希望得到答案。

在这里输入图像说明

迈克尔Dautermann答案已经得到一切正常,但为了隐藏配件栏,你需要调用UIView类的方法inputAccessoryView()与_NoInputAccessoryView类的inputAccessoryView()。 我刚刚添加了几行额外的代码,这样做的方法swizzling的工作。

首先,你需要一个虚拟的类来交换

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

然后在你的控制器类中创build这个方法

 /// 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 String(describing: type(of: view)).hasPrefix("WKContent") { targetView = view } } guard let target = targetView else { return } let noInputAccessoryViewClassName = "\(target.superclass!)_NoInputAccessoryView" var newClass: AnyClass? = NSClassFromString(noInputAccessoryViewClassName) if newClass == nil { let targetClass: AnyClass = object_getClass(target) newClass = objc_allocateClassPair(targetClass, noInputAccessoryViewClassName.cString(using: String.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;)

这个代码片段应该让你解决你的问题:

 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 String(view.dynamicType).hasPrefix("WKContent") { targetView = view } } // only optionals can be nil if targetView == nil { return } let noInputAccessoryViewClassName = "\(targetView!.superclass)_NoInputAccessoryView" var newClass : AnyObject? = NSClassFromString(noInputAccessoryViewClassName) if newClass == nil { let uiViewClass : AnyClass = object_getClass(targetView!) newClass = objc_allocateClassPair(uiViewClass, noInputAccessoryViewClassName.cStringUsingEncoding(NSASCIIStringEncoding)!, 0) } } 

你也可以使用“ String(view.dynamicType) ”来获取你正在查看的对象的类名, 正如我在研究解决你的问题的方法时通过这个答案注意到的那样 。

在Objective-C和Swift中使用hasPrefix是非常不合适的,也许隐藏键盘的更好的方法可以find生产代码?

这里有一个更安全的(没有不安全的解包)版本与Swift 4和(至less)iOS 9槽11。

 fileprivate final class InputAccessoryHackHelper: NSObject { @objc var inputAccessoryView: AnyObject? { return nil } } extension WKWebView { func hack_removeInputAccessory() { guard let target = scrollView.subviews.first(where: { String(describing: type(of: $0)).hasPrefix("WKContent") }), let superclass = target.superclass else { return } let noInputAccessoryViewClassName = "\(superclass)_NoInputAccessoryView" var newClass: AnyClass? = NSClassFromString(noInputAccessoryViewClassName) if newClass == nil, let targetClass = object_getClass(target), let classNameCString = noInputAccessoryViewClassName.cString(using: .ascii) { newClass = objc_allocateClassPair(targetClass, classNameCString, 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) } }