如何在 Swift 中使用 WKwebView 制作一个 activity 指示符

How to make an activity indecator with a WKwebView in Swift

我正在尝试用 Swift 制作一个 iOS 应用程序,我已经整理出可以完美运行的 webView,但是现在我想实现一个 activity 指示器。它显示正确并且是动画的,但是当页面加载时,activity 指示器不会消失。

这是我的代码:

import UIKit
import WebKit

class FirstViewController: UIViewController {
    @IBOutlet var webview: WKWebView!
 //   @IBOutlet var bg: UIView!
   // @IBOutlet var logo: UIImageView!

    @IBOutlet var ActInd: UIActivityIndicatorView!

   // @IBOutlet var LoadingLabel: UILabel!
    override func viewDidLoad() {
        super.viewDidLoad()
        let url = URL(string: "https://www.google.com")
        let request = URLRequest(url: url!)
        webview.load(request)

        // Do any additional setup after loading the view, typically from a nib.
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

 func webViewDidStartLoad(_ : WKWebView) {
        ActInd.startAnimating()
        //LoadingLabel.isHidden = true
        //logo.isHidden = true
        //bg.isHidden = true

    }

    func webViewDidFinishLoad(_ : WKWebView){
        ActInd.stopAnimating()
       // LoadingLabel.isHidden = true
        //logo.isHidden = true
        //bg.isHidden=true
    }


}

如果有人能帮我让 activity 指示器消失,我将不胜感激。

提前致谢

尝试设置

ActInd.hidesWhenStopped = true // In viewDidLoad

在 view did load 上只是启动你的指示器,而在 webViewDidFinishLoad 上只是隐藏那个加载器。

永远不会调用这些方法。

因为,您还没有将 ViewController 设置为 NavigationDelegate。它需要符合WKNavigationDelegate。然后,您可以在 viewDidLoad() 函数中设置委托:

webview.navigationDelegate = self

您调用的2个方法似乎也不存在。这些是等效的委托方法:webView(:didCommit:) and webView(:didFinish:)

您可以在故事板中设置 "Hides when stopped" 和 "Animated" 或按照此 中的说明以编程方式进行设置。

您还应该看看 API Design guidelines 解释应该如何编写代码。特别是你应该:

Follow case conventions. Names of types and protocols are UpperCamelCase. Everything else is lowerCamelCase.

符合WKNavigationDelegate,可以跟踪webView进程..

The methods of the WKNavigationDelegate protocol help you implement custom behaviors that are triggered during a web view's process of accepting, loading, and completing a navigation request.

您可以使用两种方法:

func webView(WKWebView, didStartProvisionalNavigation: WKNavigation!)

当 Web 内容开始在 Web 视图中加载时调用。

在这里您可以显示 activity 指标

func webView(WKWebView, didFinish: WKNavigation!)

导航完成时调用。

有关更多信息,请查看 WKNavigationDelegate documentation

步骤如下:

1- 符合 WKNavigationDelegate。

2- 将您的视图控制器指定为您的 web 视图的 navigationDelegate。

3- 实施 didStartProvisionalNavigationdidFinish 方法

示例:

class ViewController: UIViewController, WKNavigationDelegate {
    @IBOutlet var webview: WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()
        webview.navigationDelegate = self
        /*
         ....
         */
    }

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        // hide/stop indicator
    }

    func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
        //show your activity
    }

}