从Nib或Storyboard在WKWebView上设置WKWebViewConfiguration

Mat*_*t.M 10 interface-builder uiwebview ios wkwebview

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

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

Ram*_*d A 7

由于 WKWebView 的配置属性是只读的,因此无法通过 WKWebView 的出口从 storyboard 中设置 WKWebView 的配置,而是需要通过编程方式进行配置,如下所示。

class ViewController: UIViewController, WKScriptMessageHandler {

    @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!)
}
Run Code Online (Sandbox Code Playgroud)

并实现WKScriptMessageHandler委托方法

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
    if (message.name == "callbackHandler"){
        print("\(message.body)")
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助...


Rav*_*mar 7

让我们以您的自定义配置为例。

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;
Run Code Online (Sandbox Code Playgroud)

  • 然而,这并没有解决所提出的实际问题,因为没有任何地方添加了自定义 WKWebViewConfiguration。我想海报没问题,但我需要做一些其他的事情,这个答案的技术不起作用。我会为此提出一个新问题。 (4认同)
  • 对我来说就是这样:将 `userContentController` 更改为具有相同脚本的脚本并没有做任何事情,但是直接在现有的 `userContentController` 上调用 `addUserScript` 就像一种魅力。 (2认同)

gur*_*uru 6

是的!!!我们可以从 Nib 或 Storyboard 在 WKWebView 上设置 WKWebViewConfiguration 我为此使用以下代码:

这是我的 IBOutlet--

 @IBOutlet  var webViewChat: WKWebView!
Run Code Online (Sandbox Code Playgroud)

//使用下面的代码你可以设置配置

 webViewChat.configuration.userContentController.add(self, name: "edit")
 webViewChat.configuration.userContentController.add(self, name: "remove")
Run Code Online (Sandbox Code Playgroud)

注意: 确保在设置配置后加载 URL


Ang*_*lao 5

您可以在Storyboard中创建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)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 另外,我认为这种方法可能不起作用,因为在初始 WKWebView 创建时不会调用 createWebViewWith... ,只会在后续创建时调用。原因是在 viewDidLoad() 运行时第一个已经创建了。 (6认同)
  • 我自己尝试过。为了节省您的时间:这不起作用! (6认同)

iOS*_*use 5

我的回答并不能解决每个人的问题,但请务必检查 Storyboard 中 WKWebView 的属性检查器,看看是否可以在那里设置您想要对配置进行的更改。

我只是花了一个小时试图在代码中解决这个问题,当时我所要做的就是选中属性检查器中的 2 个框。