带有百分比的 UIProgressView 加载栏

UIProgressView loading bar with percentage

我想在 Swift 3 中为我的 iOS 项目制作一个加载栏。我目前正在做一个网络视图,需要做这个加载栏来显示在操作之间。我知道这是假的加载栏,我在 Objective-C 中看到了代码,并试图在 Swift 中用它做点什么,但恐怕我的逻辑是错误的,因为我是 [=] 中的新手24=].

我遇到的问题是我实际上不知道我是否将 vars theBooltimer 设置到正确的位置并且我不知道如何使用 Timer() .

告诉你我在 运行 应用程序时看到的情况,进度条一直在显示,但没有加载。

到目前为止,这是我的代码

import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var webView: UIWebView!
    @IBOutlet weak var progressView: UIProgressView!

    var theBool = false
    var timer = Timer()

    override func viewDidLoad() {
        super.viewDidLoad()

        progressView.progress = 0.0

        //Reading the webview
        let websiteURL = URL(string: "http://google.com")
        let websiteURLRequest = URLRequest(url: websiteURL!)
        webView.loadRequest(websiteURLRequest)
    }

    func webViewDidFinishLoad (){
        if webView.isLoading == true {
        theBool = true
        }
    }

    func handleProgress () {
        if (theBool){
            if (progressView.progress >= 1) {
                progressView.isHidden = true
                timer.invalidate()
            } else {
                progressView.progress += 0.1
            }
        } else {
            progressView.progress += 0.05
            if (progressView.progress >= 0.95) {
                progressView.progress = 0.95
            }
        }
    }

    /*
    func addValsToProgress () ->String {
        if (webViewLoading() == true) {
            view.progressView.setProgre
        }
    }
    */
}

根据您提供的代码,您需要使用时间间隔和操作来初始化 timer。这样,当调用计时器时,它会调用 handleProgress。当加载状态开始时计时器应该 fire 并且会定期调用 handleProgress 直到加载完成。届时,计时器将为 invalidated 并将停止调用 handleProgress

请参阅 https://developer.apple.com/reference/foundation/timer 了解如何操作。

你不需要假的加载栏。你可以使用 WKWebView

KVO 观察员

您可以将 KVO 观察器设置为该值:

https://developer.apple.com/reference/webkit/wkwebview/1415007-estimatedprogress

YouTube 视频:https://www.youtube.com/watch?v=vd3Imcc7ctw

这里有一个较早的例子:https://www.hackingwithswift.com/example-code/wkwebview/how-to-monitor-wkwebview-page-load-progress-using-key-value-observing

关于 github 搜索的更多示例:https://github.com/search?l=Swift&o=desc&q=estimatedProgress+addObserver&s=indexed&type=Code&utf8=%E2%9C%93

代表

WKNavigationDelegate

https://developer.apple.com/reference/webkit/wknavigationdelegate

这里还有一些委托回调:

optional func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)

https://developer.apple.com/reference/webkit/wknavigationdelegate/1455629-webview

PS: 还有WKUIDelegate——但是没有那么有趣的方法

https://developer.apple.com/reference/webkit/wkuidelegate

所以在尝试了几次您发布的解决方案后,我找到了答案。 简单到让我汗颜

它就像一个魅力。谢谢大家的回答:)

@IBOutlet var webView: UIWebView!
@IBOutlet var progressView: UIProgressView!

override func viewDidLoad() {
    super.viewDidLoad()
    let url = NSURL(string: "http://google.com")
    let request = NSURLRequest(url: url as! URL)
    webView.loadRequest(request as URLRequest)
    webView.delegate=self
}

func webViewDidStartLoad(_ webView: UIWebView) {

    self.progressView.setProgress(0.1, animated: false)
}


func webViewDidFinishLoad(_ webView: UIWebView) {

    self.progressView.setProgress(1.0, animated: true)
}

func webView(_ webView: UIWebView, didFailLoadWithError error: Error) {

    self.progressView.setProgress(1.0, animated: true)
}