Swift UIWebView 委托使用和覆盖 shouldStartLoadWith

Swift UIWebView Delegate use and override shouldStartLoadWith

我正在编写一个可重用的 UIWebView 控制器,并希望在使用委托 shouldStartLoadWith 函数时继承它并覆盖它,但我不确定该怎么做。

在我的可重复使用 UiWebView 控制器中,我有这个。

func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {

    let docURLStr = request.mainDocumentURL!.absoluteString

    if docURLStr.contains("login") {
       loadLoginView()
        return false
    }

然后在我的 child class 中,我想执行以下操作,但我想同时使用两者 functions.How 我可以这样做吗?

override func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {

let docUrl = request.url!.absoluteString

if String(describing: docUrl).range(of: "some string in the url") != nil{
     return true
     } else {
       return false
       }
}

您可以简单地使用 super 实现并使用逻辑或或与将两者结合起来,具体取决于您想要实现的目标:

override func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool
{
    let docUrl = request.url!.absoluteString
    let load = String(describing: docUrl).range(of: "some string in the url") != nil
    return load || super.webView(webView, shouldStartLoadWith: request, navigationType: navigationType)
}

要检查多个字符串,您可以这样做:

override func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool
{
    let docUrl = request.url!.absoluteString
    let superWantsToLoad = super.webView(webView, shouldStartLoadWith: request, navigationType: navigationType)
    let strings = ["foo", "bar"]
    return superWantsToLoad || strings.contains(where: { docUrl.contains([=11=]) })
}

请注意,由于短路评估,只有在 superWantsToLoad 为假时才会评估 string.contains() 调用。 如果您要处理许多字符串,这可能很重要。 (或者,您可以提前插入 return true。)