我想向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控制器。
现在,在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中。
因此,当我进入函数doCalculation时,进度条应该出现。
事实上,进度条container_elementProperty (UIview)是在计算完成后才出现的,这使得进度条毫无用处。
知道如何使名为container_elementProperty UIView的视图可见吗?
我即将解决这个问题,因为我可以看到堆栈的进度如下图,我只想在完成计算之前在屏幕上显示这个。
swift - 添加进度条 -  Swift-LMLPHP
为什么我不能把视图放在屏幕上,同时进行计算,因为你可以看到,第2步首先运行。
与此问题相关的警告是:UIView.addSubview(_:) must be used from main thread only
在Github,可以在此link上检查示例项目。
感谢任何支持。

最佳答案

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

关于swift - 添加进度条 - Swift,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55075254/

10-12 00:15
查看更多