【问题标题】:How to make an activity indecator with a WKwebView in Swift如何在 Swift 中使用 WKwebView 制作活动指示符
【发布时间】:2019-01-18 18:31:54
【问题描述】:

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

这是我的代码:

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
    }


}

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

提前谢谢你

【问题讨论】:

    标签: ios swift swift3 swift4


    【解决方案1】:

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

    WKNavigationDelegate 协议的方法可帮助您实现在 Web 视图接受、加载和完成导航请求的过程中触发的自定义行为。

    您可以使用两种方法:

    func webView(WKWebView, didStartProvisionalNavigation: WKNavigation!)

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

    这里可以显示活动指示器

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

    【讨论】:

      【解决方案2】:

      永远不会调用这些方法。

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

      webview.navigationDelegate = self
      

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

      您可以在情节提要中设置“停止时隐藏”和“动画”,或者按照answer 中的说明以编程方式进行。

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

      遵循大小写约定。类型和协议的名称是 UpperCamelCase。其他的都是lowerCamelCase。

      【讨论】:

        【解决方案3】:

        在视图上确实加载只是启动你的指示器,在 webViewDidFinishLoad 上只是隐藏那个加载器。

        【讨论】:

        • 我是这样做的:func webViewDidFinishLoad(_ : WKWebView){ ActInd.isHidden = true // LoadingLabel.isHidden = true //logo.isHidden = true //bg.isHidden=true } 它什么也没做
        • 你只需添加到主调度方法中。
        【解决方案4】:

        尝试设置

        ActInd.hidesWhenStopped = true // In viewDidLoad
        

        【讨论】:

        • 我已经尝试过了,我没有收到错误,但它也没有做任何事情
        • 你想达到什么目的?上面的问题提到了答案
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-10
        • 2020-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多