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

4
我有一些使用WKWebView加载的网页代码。是否有一种方法可以将唯一的完成处理程序函数附加到每个WKWebView.loadHTMLString调用中?
我注意到每个返回值都是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")
})

1
@matt,我不能使用WKNavigation,因为它是委派给单个对象的所有导航事件(如果我理解正确的话)。我有多个需要加载HTML字符串,然后执行一些操作的对象。我正在尝试实现类似于evaluateJavaScript(_:completionHandler:)的东西,但用于加载HTML。 - user2560886
但这不仅仅是智能路由消息的问题吗? - matt
1个回答

8
正如你所说,loadString 返回一个 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()
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接