嗨,我对快速编码很陌生,并尝试使用 UIProgressView 制作一个假进度条。
我在
viewDidAppear
中有代码,因此一旦视图控制器出现,它就会启动,但 IBOutlet
变量都不起作用。
知道如何解决这个问题吗?
我假设这与由于某种原因在
viewDidAppear
中未被识别的变量有关,但我不知道为什么。
这是我的代码的代码块
class ViewController: UIViewController {
@IBOutlet weak var label: UILabel!
@IBOutlet weak var pBar: UIProgressView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
label.text = String(0) + "%" //Initialize Label Value
}
override func viewDidAppear(_ animated: Bool) {
while pBar.progress < 1{
pBar.progress += 0.1
sleep(2)
label.text = String(Int(pBar.progress * 100))+"%"
print(pBar.progress)
}
//sleep(10) // Short delay for effect at 100 percent :)
performSegue(withIdentifier: "progressComplete", sender: nil) // Found this from https://stackoverflow.com/questions/18947328/conditional-segue-using-storyboard just used modern swift syntax for said command rather than c
}
//Function to make Progress bar work
}
尝试放入一个单独的函数,但仅此而已。只是想让进度条值随着我的 while 循环而更新。
您在 viewDidAppear 中使用的带有 while 循环和 sleep 的方法会导致 UI 响应能力出现问题,因为它会阻塞主线程。要随时间平滑更新进度条,请使用 Timer 或 DispatchQueue 安排定期更新而不阻塞主线程。
这是代码的改进版本,它使用计时器来更新进度条和标签:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var label: UILabel!
@IBOutlet weak var pBar: UIProgressView!
var timer: Timer?
override func viewDidLoad() {
super.viewDidLoad()
label.text = "0%" // Initialize Label Value
pBar.progress = 0 // Initialize Progress Bar Value
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// Start a timer to update the progress bar
timer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(updateProgress), userInfo: nil, repeats: true)
}
@objc func updateProgress() {
if pBar.progress < 1.0 {
pBar.progress += 0.1
label.text = "\(Int(pBar.progress * 100))%" // Update Label to show percentage
print("Progress: \(pBar.progress * 100)%")
} else {
timer?.invalidate() // Stop the timer once progress reaches 100%
performSegue(withIdentifier: "progressComplete", sender: nil) // Trigger the segue
}
}
}
解释 定时器设置:
创建一个Timer,每隔0.5秒重复调用一次updateProgress方法。这使得进度条能够随着时间的推移平滑更新,而不会阻塞主线程。
更新进度:每次调用 updateProgress 时,都会将进度增加 10% (0.1)。标签也已更新以反映百分比。
停止定时器:当进度条达到100%(pBar.progress为1.0)时,定时器失效,停止进一步更新,并触发segue。