借助iOS 11,Apple在您的笔尖和故事板上添加了添加WKWebViews插座的功能集。当使用自动设置的默认WKWebViewConfiguration时,它似乎工作正常。
但是,我希望能够使用自定义WKWebViewConfiguration。无论如何我可以在之前,或者从nib初始化WKWebView之后设置它吗?
答案 0 :(得分:4)
让我们以您的自定义配置示例为例。
NSString *jScript = @"var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);";
WKUserScript *wkUScript = [[WKUserScript alloc] initWithSource:jScript injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
//Here you can customize configuration
[self.webView.configuration.userContentController addUserScript:wkUScript];
// self.webView.navigationDelegate = self;
// self.webView.contentMode = UIViewContentModeScaleAspectFill;
答案 1 :(得分:3)
您可以在情节提要中创建WKWebView,然后使用WKUIDelegate:createWebViewWith
仅通过配置即可创建新的WKWebView。
class WindowViewController: UIViewController {
// The WKWebView created from storyboard
@IBOutlet var webView: WKWebView!
override func viewDidLoad() {
// Delegate the webview's uiDelegate
self.webView.uiDelegate = self
}
}
extension WindowViewController: WKUIDelegate {
func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
// Create new WKWebView with custom configuration here
let configuration = WKWebViewConfiguration()
return WKWebView(frame: webView.frame, configuration: configuration)
}
}
答案 2 :(得分:2)
我的答案不能解决每个人的问题,但请确保在情节提要中检查WKWebView的属性检查器,以查看是否可以在此处设置要对配置进行的更改。
我只花了一个小时试图用代码弄清楚这一点,而我所要做的就是选中Attributes Inspector中的2个框。
答案 3 :(得分:0)
由于WKWebView的配置属性是只读的,因此无法通过故事板中的WKWebView插座设置WKWebView的配置,而是需要按照下面的编程配置。
class ViewController: UIViewController {
@IBOutlet weak var webContentView: UIView!
var webView: WKWebView?
let contentController = WKUserContentController()
contentController.add(self, name: "callbackHandler")
let configuration = WKWebViewConfiguration()
configuration.userContentController = contentController
self.webView = WKWebView(frame: self.webContentView.bounds, configuration: configuration)
self.webContentView.addSubview(self.webView!)
}
实现 WKScriptMessageHandler 委托方法
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
if (message.name == "callbackHandler"){
print("\(message.body)")
}
}
希望这会有所帮助......
答案 4 :(得分:0)
您可以尝试以下方法:
let userContentController = WKUserContentController()
self.webView.configuration.userContentController = userContentController
答案 5 :(得分:0)
是的!我们可以在Nib或Storyboard的WKWebView上设置WKWebViewConfiguration,我正在使用以下代码:
这是我的IBOutlet-
@IBOutlet var webViewChat: WKWebView!
//使用下面的代码可以设置配置
webViewChat.configuration.userContentController.add(self, name: "edit")
webViewChat.configuration.userContentController.add(self, name: "remove")
注意: 请确保在设置配置后加载URL
答案 6 :(得分:0)
对于目标C:
WKWebViewConfiguration *config = _webView.configuration;
WKUserContentController* ctrl = [[WKUserContentController alloc] init];
[ctrl addScriptMessageHandler:self name:@"method1"];
[ctrl addScriptMessageHandler:self name:@"method2"];
// others ...
config.userContentController = ctrl;
并添加WKScriptMessageHandler的实现:
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
NSLog(@"userContentController:didReceiveScriptMessage: message=%@", message);
if ([message.name isEqualToString:@"method1"] && message.body
// &&[message.body isKindOfClass:[NSString class]]
) {
// do something
} else if ([message.name isEqualToString:@"method2"] && message.body
) {
// do something
}
}