Swift UIWebView委托使用和覆盖shouldStartLoadWith

时间:2017-03-16 17:37:26

标签: swift3 uiwebview uiwebviewdelegate

我正在编写一个可重用的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
    }

然后在我的孩子课上我想做以下但我想要使用这两个功能。我该怎么做?

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
       }
}

1 个答案:

答案 0 :(得分:1)

您可以简单地使用超级实现,并使用逻辑或or组合两者,具体取决于您希望实现的目标:

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($0) })
}

请注意,只有在string.contains()错误时才会评估superWantsToLoad来电,这要归功于短路评估。 如果您要处理许多字符串,这可能很重要。 (或者,您可以插入早期return true。)