从Nib或Storyboard在WKWebView上设置WKWebViewConfiguration

时间:2018-01-25 20:22:06

标签: ios uiwebview interface-builder wkwebview

借助iOS 11,Apple在您的笔尖和故事板上添加了添加WKWebViews插座的功能集。当使用自动设置的默认WKWebViewConfiguration时,它似乎工作正常。

但是,我希望能够使用自定义WKWebViewConfiguration。无论如何我可以在之前,或者从nib初始化WKWebView之后设置它吗?

7 个答案:

答案 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
    }
}