从按钮操作调用时,UIActivityIndi​​catorView不显示

时间:2016-01-17 18:18:44

标签: ios swift uiactivityindicatorview

我试图在按钮按下的可能冗长的动作中显示一个微调器,但我无法显示它。这是我的代码:

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中的表视图行(也可能触发一些冗长的数据更新操作)后尝试显示微调器时,我遇到了同样的问题。

那么在这些情况下显示活动指标的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

你想要的是:

@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线程,并停止微调器。