以编程方式专注于webview中的表单(WKWebView)

使用UIWebView可以使用以下方法:

[webView setKeyboardDisplayRequiresUserAction:NO] Call some JS function 

如果webview是WKWebView你怎么能做到这WKWebView

相关: 我怎样才能得到一个UIWebView专注于表单input和调出键盘?

在深入了解Webkit资源几个星期后,我设法通过在WKContentViewWKContentView _startAssistingNode:userIsInteracting:blurPreviousNode:userObject ,并重写userIsInteracting值来实现在iOS 9上的工作:

伪代码:

 swizzle_intercept("WKContentView", "_startAssistingNode:userIsInteracting:blurPreviousNode:userObject:", &hackAssist); void hackAssist (id self, SEL _cmd, void* arg0, BOOL arg1, BOOL arg2, id arg3) { ((void (*)(id,SEL,void*,BOOL,BOOL,id))swizzle_interceptee(hackAssist))(self, _cmd, arg0, TRUE, arg2, arg3); } 

干杯!

我写了一个扩展(在Swift 3 *为WKWebView类,它添加了keyboardDisplayRequiresUserAction作为一个计算属性,就像在UIWebView。

您可以在这个博客中find完整的解决scheme,或者这里是一个快速的片段:

在提到苹果的WebKit官方开源文档之后,我提出了以下的运行时间调整:

 func setKeyboardRequiresUserInteraction() { let sel: Selector = sel_getUid("_startAssistingNode:userIsInteracting:blurPreviousNode:userObject:") let WKContentView: AnyClass = NSClassFromString("WKContentView")! let method = class_getInstanceMethod(WKContentView, sel) let originalImp: IMP = method_getImplementation(method) let original: ClosureType = unsafeBitCast(originalImp, to: ClosureType.self) let block : @convention(block) (Any, UnsafeRawPointer, Bool, Bool, Any) -> Void = {(me, arg0, arg1, arg2, arg3) in original(me, sel, arg0, true, arg2, arg3) } let imp: IMP = imp_implementationWithBlock(block) method_setImplementation(method, imp) }