我正在尝试制作加载栏,因为我完成一个长函数可能需要几秒钟。但是我不知道如何弄清楚函数执行的程度以及如何在UI中触发更改。以下是我的工作正常,但我不会完全按照预期行事。有什么建议吗?
func build(_ sender: UIButton) {
let myMutableString = NSMutableAttributedString(string: "Compiling Latest Clean Build", attributes: [NSFontAttributeName: buildLbl.font])
buildLbl.attributedText = myMutableString
let greenStrip = UIView()
greenStrip.backgroundColor = Colors().green
greenStrip.frame = CGRect(x: 0, y: buildStatus.frame.height - 2.5, width: 10, height: 2.5)
buildStatus.addSubview(greenStrip)
UIView.animate(withDuration: 2.0, animations: {
// compile can take a while
compile(structureContent: structuredContent)
greenStrip.frame = CGRect(x: 0, y: self.buildStatus.frame.height - 2.5, width: self.buildStatus.frame.width, height: 2.5)
}, completion: {
(value: Bool) in
greenStrip.removeFromSuperview()
let dvc : PreviewViewController = self.storyboard?.instantiateViewController(withIdentifier: "PreviewViewController") as! PreviewViewController
self.navigationController?.pushViewController(dvc, animated: false)
})
}
答案 0 :(得分:0)
您希望跟踪循环通过数据结构的Rectangle
函数所做的进展并执行操作。首先,您需要来自compile()
函数的委托函数,该函数将进度报告为百分比,以便稍后可以在UI上显示该函数。您可以找到有关委托here的完整教程,您的协议将类似于
compile()
现在,这是报告进度的示例方式。在protocol ProgressDelegate: class {
func didFinishTask(progress: Double)
}
函数的开头,您希望从数据结构中获取总计作业的计数。然后在for循环的每一轮中,将当前循环计数除以总计数,然后由委托报告此进度。所以你的代码看起来像
compile()
最后,在您的UI视图控制器中接收此委托。更新UI基础,完成任务的百分比。
func compile(){
...
let totalJobs = jobs.count
let counter = 0.0
for eachJob in jobs {
counter += 1.0
...
didFinishTask(progress: counter/totalJobs)
}
}