viewDidAppear 不允许我编辑 IBOutlets

问题描述 投票:0回答:1

嗨,我对快速编码很陌生,并尝试使用 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 循环而更新。

swift storyboard iboutlet uiprogressview viewdidappear
1个回答
0
投票

您在 viewDidAppear 中使用的带有 while 循环和 sleep 的方法会导致 UI 响应能力出现问题,因为它会阻塞主线程。要随时间平滑更新进度条,请使用 TimerDispatchQueue 安排定期更新而不阻塞主线程。

这是代码的改进版本,它使用计时器来更新进度条和标签:

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

解释 定时器设置:

  1. 创建一个Timer,每隔0.5秒重复调用一次updateProgress方法。这使得进度条能够随着时间的推移平滑更新,而不会阻塞主线程。

  2. 更新进度:每次调用 updateProgress 时,都会将进度增加 10% (0.1)。标签也已更新以反映百分比。

  3. 停止定时器:当进度条达到100%(pBar.progress为1.0)时,定时器失效,停止进一步更新,并触发segue。

© www.soinside.com 2019 - 2024. All rights reserved.