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

Add unique completion handler to every WKWebView load

我有使用 WKWebView 加载多个网页的代码。有没有办法为每个 WKWebView.loadHTMLString 调用附加一个唯一的完成处理函数。

我注意到每个 returns WKNavigation?,但我不想使用 WKNavigationDelegate,因为这是所有加载事件。

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

wkWebView?.loadHTMLString("<p>Loading page #1</p>", baseURL: nil)

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

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

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

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

正如您自己所说的那样,loadString returns 一个 WKNavigation 对象 正是为了这个目的。因此,只需为自己创建一个字典,将 WKNavigation 对象与完成处理程序相关联,在调用时存储该处理程序:

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

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

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