向每个WKWebView加载添加唯一的完成处理程序

use*_*886 3 ios swift wkwebview

我有使用加载多个网页的代码WKWebView。有没有一种方法可以将唯一的完成处理程序函数附加到每个WKWebView.loadHTMLString调用。

我注意到了每个返回值WKNavigation?,但是我不想使用它,WKNavigationDelegate因为它用于所有加载事件。

例如,现在没有完成处理程序,我这样做:

wkWebView?.loadHTMLString("<p>Loading page #1</p>", baseURL: nil)
Run Code Online (Sandbox Code Playgroud)

我想要一个像这样的独特完成处理程序:

wkWebView?.loadHTMLString("<p>SLoading page #1</p>", baseURL: nil, completionHandler: {
    print("Loaded page #1. Doing things only required for page #1.")
})
Run Code Online (Sandbox Code Playgroud)

然后对于不同的负载,我可以更改完成处理程序:

wkWebView?.loadHTMLString("<p>SLoading page #2</p>", baseURL: nil, completionHandler: {
    print("Loaded page #2")
})
Run Code Online (Sandbox Code Playgroud)

mat*_*att 5

就像您自己正确说loadString的那样,正是出于这个目的返回WKNavigation对象。因此,只需为自己创建一个字典,即可将该WKNavigation对象与完成处理程序相关联,该处理程序将在调用时存储:

var navs = [WKNavigation : () -> ()]()
func loadString(_ s:String, completionHandler:@escaping ()->()) {
    if let nav = wkWebView?.loadHTMLString(s, baseURL:nil) {
        self.navs[nav] = completionHandler
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,作为WKWebView的navigationDelegate,当您听到页面已加载时,可以调用其相应的完成处理程序:

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    if let f = self.navs[navigation] {
        f()
    }
}
Run Code Online (Sandbox Code Playgroud)