Activity 当 webview 完成加载时指示器不会停止

Activity indicator not stopping when webview has finished loading

有人知道为什么我的 activity 指示器在 webview 完成加载后没有停止吗? Web 视图已委托,UIActivityIndicatorView 开始动画等,在我的代码中... ?

这是相关代码:

import UIKit

class ViewController: UIViewController, UIWebViewDelegate {
@IBOutlet weak var webview: UIWebView!
@IBOutlet weak var activity: UIActivityIndicatorView!

var url = "http://apple.com"

func loadURL () {
    let requestURL = NSURL(string: url)
    let request = NSURLRequest(URL: requestURL!)
    webview.loadRequest(request)

}

override func viewDidLoad() {
    super.viewDidLoad()
    loadURL()
    // Do any additional setup after loading the view, typically from a nib.
    webview.delegate = self;
    }


func webviewDidStartLoad(_ : UIWebView){
activity.startAnimating()

    NSLog("The webview is starting to load")
    }

func webviewDidFinishLoad(_ : UIWebView){
    activity.stopAnimating()
    activity.hidden=true;
    NSLog("The webview is done loading")
    }

谢谢!

注意函数名称!它是 webView...,驼峰式大小写:)

你得到"The webview is done loading"了吗?如果没有,可能是请求需要很长时间才能完成。

但是,您应该实施 func webView(webView: UIWebView, didFailLoadWithError error: NSError?) 来检测是否有任何错误并停止 activity。

实际上,正确答案可能是 DAN 和 iGongora 的组合,加上可能的第三个原因。

眼前的问题是,即使在快乐路径场景(webview 成功完成)中,它也应该是以下内容(注意函数名 webV[=25 的大小写=]iewDidStartLoad 和 webViewDidFinishLoad

func webViewDidStartLoad(webView: UIWebView) {
    activity.startAnimating()
    NSLog("The webview is starting to load")
}

 func webViewDidFinishLoad(webView: UIWebView) {
    activity.stopAnimating()
    activity.hidden=true;
    NSLog("The webview is done loading")
}

此外,如果 UIWebView 失败,您还应该停止微调器。

func webView(webView: UIWebView!, didFailLoadWithError error: NSError!) {
    activity.stopAnimating()
    activity.hidden=true;
    print("Webview fail with error \(error)");
}

另一个可能的问题是您没有正确设置委托。您可以在 viewDidLoad 或 Interface Builder 中执行此操作。

override func viewDidLoad() {
    super.viewDidLoad()
    ...
    self.webView.delegate = self;
    ...
}

运行 这在主队列中所以这将停止其他方式不是这个 swift 4 和 swift 3 的代码是

 Dispatchqueue.main.async{
      activity.stopAnimating()
 }