添加进度栏-Swift

时间:2019-03-09 08:02:04

标签: swift progress-bar

我想将进度条添加到tableViewController。

我有一个叫做HelpersFunctions的函数,它可以完成所有计算。 函数doCalculation负责计算。

因此,我将以下通知添加到doCalculation中,如下所示:

NotificationCenter.default.post(name: .return_progress, object: self)
for i in 1...n1 {
 //Do all the calculation
}

因此,一旦我到达NotificationCenter.default.post,它将移至名为CreateNewElementVC的Tableview Controller

现在,在ViewDidLoad内,我添加了以下行:

//progress
NotificationCenter.default.addObserver(self, selector: #selector(showProgress), name: .return_progress, object: nil)

在同一个swift文件中,添加了以下内容:

let container_elementProperty: ProgressBarView = {
    let view = ProgressBarView()
    view.backgroundColor = UIColor(white: 0, alpha: 0.5)
    view.translatesAutoresizingMaskIntoConstraints = false
    return view
}()

    @objc func showProgress() {
    if(progressCounter > 1.0){timer.invalidate()}
    print("Step 1")
    container_elementProperty.frame = CGRect(x: 100, y: 100, width: 200, height: 200)
    container_elementProperty.backgroundColor = UIColor(white: 0, alpha: 0.5)
    container_elementProperty.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleDismiss)))

    let queue = DispatchQueue(label: "queue1", qos: .userInteractive)
    queue.async {
        print("Step 2")
        self.view.addSubview(self.container_elementProperty)

    }

    //view.addSubview(container_elementProperty)
    print("Step 3")
    container_elementProperty.progress = progressCounter
    progressCounter = progressCounter + progressIncrement

    let x1: Float = Float(start_Counting)
    let x2: Float = Float(End_Counting)

    let xx: Float = x1 / x2 * 100

    print("Start at: \(xx) %)")

}

因此,首先我将所有必需的数据放入CreateNewElementVC,然后有一个名为run的按钮来进行所有计算,然后它将所有结果移到另一个TableViewController。 / p>

因此,当我在函数doCalculation中时,进度条应该会出现。

实际上,进度栏container_elementProperty (UIview)刚在计算完成后出现,这使进度栏无用。

有什么主意如何让名为container_elementProperty UIView的View可见?

我即将解决此问题,因为我可以看到堆栈中的进度,如下图所示,我只想在完成计算之前在屏幕上显示它。

enter image description here

为什么在执行计算时无法将视图显示在屏幕上,因为您可以看到首先执行了步骤2。 与该问题相关的警告是:UIView.addSubview(_:) must be used from main thread only

可以在github上的link上检查示例项目。 感谢任何支持。

2 个答案:

答案 0 :(得分:2)

  • 要模拟进度(例如网络请求),您不能简单地在主线程中执行for循环,则应使用GCD
  • 要更新正在进行的操作的进度,请使用Delegation,而不是KVO
  • 使用全局变量会使您的代码有缺陷,请避免!

这是您代码的working version

enter image description here

答案 1 :(得分:0)

# Write By Tushar on 11/02/2021#

    import UIKit

class ViewController: UIViewController {
    let totalValue:Float = 80.0
    var firstNumber:Int? = 0
    @IBOutlet weak var progressBar: UIProgressView!
    override func viewDidLoad() {
        super.viewDidLoad()
        progressBar.trackTintColor = .white
        progressBar.tintColor = .red
        // Do any additional setup after loading the view.
         progressBar.setProgress(0.0, animated: false)
    }
    func setProgress(firstValue:Float){
       let processValue = firstValue/totalValue
        progressBar.setProgress(processValue, animated: true)
    }

    @IBAction func btnResetClick(_ sender: UIButton) {
         print("Reset Button Clicked")
        firstNumber = 0
         progressBar.setProgress(0.0, animated: false)
    }
    @IBAction func btnShowProgressClick(_ sender: UIButton) {

      
        guard let presentValue = firstNumber else { return }

        let newValue = presentValue + 1
        firstNumber = newValue
        setProgress(firstValue: Float(firstNumber!))
    }
    
}