【发布时间】:2016-01-17 18:18:43
【问题描述】:
我试图在按下按钮调用可能很长的操作期间显示一个微调器,但我无法让它显示出来。这是我的代码:
class ViewController: UIViewController {
var actInd : UIActivityIndicatorView!
[...]
override func viewDidLoad() {
super.viewDidLoad()
self.actInd = UIActivityIndicatorView(frame: CGRectMake(0,0, 50, 50)) as UIActivityIndicatorView
self.actInd.center = view.center
self.actInd.hidesWhenStopped = true
self.actInd.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.Gray
self.view.addSubview(actInd)
[...]
}
@IBAction func buttonPressed(sender: UIBarButtonItem) {
self.actInd.startAnimating()
// [...] do some work
self.actInd.stopAnimating()
}
}
在我看来,从执行按下按钮的 UI 线程内启动时动画没有显示(如果我只在按钮调用中启动动画而不停止,它会在 buttonPressed 回调后立即开始显示完成)。我试图玩dispatch_async,但没有得到任何结果。这是我尝试过的:
第一:
@IBAction func buttonPressed(sender: UIBarButtonItem) {
dispatch_async(dispatch_get_main_queue()) {
self.actInd.startAnimating()
}
shufflePlaylist()
dispatch_async(dispatch_get_main_queue()) {
self.actInd.stopAnimating()
}
}
第二:
@IBAction func buttonPressed(sender: UIBarButtonItem) {
dispatch_async(dispatch_get_main_queue()) {
shufflePlaylist()
}
}
func shufflePlaylist() {
self.actInd.startAnimating()
// [...] do the work
self.actInd.stopAnimating()
}
第三:
@IBAction func buttonPressed(sender: UIBarButtonItem) {
self.actInd.startAnimating()
dispatch_async(dispatch_get_main_queue()) {
shufflePlaylist()
}
}
func shufflePlaylist() {
// [...] do the work
self.actInd.stopAnimating()
}
当用户在commitEditingStyle 中删除表视图行(这也可能触发一些冗长的数据更新操作)后尝试显示微调器时,我遇到了同样的问题。
那么在这些情况下显示活动指示器的正确方法是什么?
【问题讨论】:
-
start 和 stop 调用之间到底发生了什么?从您发布的内容来看,微调器似乎正在启动并立即停止,因为“做一些工作”调用是异步的。您提到您尝试过使用
dispatch_async- 您能展示您尝试过的内容吗?通常的做法是分派到工作队列,同步执行所需的操作,然后分派回主队列以停止微调器 - this tutorial 可能会有所帮助 -
“做一些工作”实际上都是在同一个线程中同步发生的(它正在做一些计算并重新排序表视图的数据源)。我已经使用
dispatch_async尝试更新了我的帖子
标签: ios swift uiactivityindicatorview