从按钮操作调用时 UIActivityIndicatorView 不显示
UIActivityIndicatorView not showing up when invoked from button action
我试图在按下按钮调用的可能很长的操作期间显示一个微调器,但我无法让它显示出来。这是我的代码:
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()
}
当用户在 [=15= 中删除 table 视图行(这也可能触发一些冗长的数据更新操作)后尝试显示微调器时,我 运行 遇到了同样的问题].
那么在这些情况下显示 activity 指标的正确方法是什么?
你想要的是这样的:
@IBAction func buttonPressed(sender: UIBarButtonItem) {
spinner.startAnimating()
let dispatchPriority = DISPATCH_QUEUE_PRIORITY_DEFAULT
dispatch_async(dispatch_get_global_queue(dispatchPriority, 0)) {
NSThread.sleepForTimeInterval(5.0) //your task here instead of this line
dispatch_async(dispatch_get_main_queue(), {
self.spinner.stopAnimating()
})
}
}
这将启动微调器,然后分派到后台线程,在那里执行任务(我假设您正在执行的任务是可以在后台线程上执行的任务 - 即它不涉及 UI 东西)。任务完成后,该方法将分派回主 UI 线程,并停止微调器。
我试图在按下按钮调用的可能很长的操作期间显示一个微调器,但我无法让它显示出来。这是我的代码:
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()
}
当用户在 [=15= 中删除 table 视图行(这也可能触发一些冗长的数据更新操作)后尝试显示微调器时,我 运行 遇到了同样的问题].
那么在这些情况下显示 activity 指标的正确方法是什么?
你想要的是这样的:
@IBAction func buttonPressed(sender: UIBarButtonItem) {
spinner.startAnimating()
let dispatchPriority = DISPATCH_QUEUE_PRIORITY_DEFAULT
dispatch_async(dispatch_get_global_queue(dispatchPriority, 0)) {
NSThread.sleepForTimeInterval(5.0) //your task here instead of this line
dispatch_async(dispatch_get_main_queue(), {
self.spinner.stopAnimating()
})
}
}
这将启动微调器,然后分派到后台线程,在那里执行任务(我假设您正在执行的任务是可以在后台线程上执行的任务 - 即它不涉及 UI 东西)。任务完成后,该方法将分派回主 UI 线程,并停止微调器。