在 WKWebView 中加载页面后,UIActivityIndi​​cator 不会隐藏

UIActivityIndicator doesn't hide after loading page in WKWebView

我正在尝试使用 UIActivityIndicator(在 Xcode 9 中)创建一个 WKWebView 应用程序。下面是我的代码,但是当我尝试模拟它时,activity 指示器不会停止,也不会隐藏。

import UIKit
import WebKit

class ViewController: UIViewController {
    @IBOutlet var loader: UIActivityIndicatorView!
    @IBOutlet var webView: WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let url = URL(string: "http://www.amritvani.nl")
        let request = URLRequest(url: url!)
        webView.navigationDelegate = self as? WKNavigationDelegate
        webView.load(request)
    }

    func webViewDidStartLoad(webView: WKWebView){
        loader.startAnimating()
    }

    func webViewDidFinishLoad(webView: WKWebView){
        loader.stopAnimating()
        loader.hidesWhenStopped = true
    }
}

有人可以帮我解决这个问题吗?

你的委托方法是错误的。将 webViewDidStartLoad(webView:) 替换为:

func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
    loader.startAnimating()
}

...和 ​​webViewDidFinishLoad(webView:) 与此:

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    loader.stopAnimating()
}

此外,您应该使 class 符合 WKNavigationDelegate:

class ViewController: UIViewController, WKNavigationDelegate

您的代码还有两个问题。首先,你不应该将 class 转换为 WKNavigationDelegateas? 如果它已经符合它:

webView.navigationDelegate = self

其次,您应该将 activity 指标的 hidesWhenStopped 属性设置为 true 停止它之前,最好在 Interface Builder 中或在 viewDidLoad。这并不重要,但如果其他人阅读您的代码,它就更有意义,如果 webView(_:didFinish:) 执行多次,这也是多余的。