Spinner不在swift中工作



我在屏幕上添加了一个微调器,但它没有显示。这是我的代码暂停微调器和播放微调器

   func pause() {
    activityIndicator = UIActivityIndicatorView(frame: CGRectMake(0, 0, 50, 50))
    activityIndicator.center = self.view.center
    activityIndicator.hidesWhenStopped = true
    activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.Gray
    view.addSubview(activityIndicator)
    activityIndicator.startAnimating()
    UIApplication.sharedApplication().beginIgnoringInteractionEvents()
}

这是我的恢复方法

func restore() {
    activityIndicator.stopAnimating()
    UIApplication.sharedApplication().endIgnoringInteractionEvents()
}

我已经在类内声明了我的微调器

var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()

这就是我称旋转器的地方

override func viewDidLoad() {
   // myarray = [""]
  // var take = NSMutableArray
    pause()
    var query = PFQuery(className:"Questions")
    query.whereKey("Level", equalTo:level)
    query.whereKey("Quiz", equalTo:quiz)
    query.orderByAscending("Ques")
    query.findObjectsInBackgroundWithBlock {
        (objects: [AnyObject]!, error: NSError!) -> Void in
        if error == nil {
            // The find succeeded.
            println("Successfully retrieved (objects.count) scores.")
            var i = 0;
            if let objects = objects as? [PFObject] {
                for object in objects {
                    println(object.objectId)
                    let pf = object as PFObject
                    let name = pf["Question"] as String
                    ql.append(name)
                    if (flag1 == 0){
                    myarr.insert(name, atIndex: i)
                    i++;
                    }
                }
            }
            println(myarr);
        } else {
            // Log details of the failure
            println("Error: (error) (error.userInfo!)")
            self.performSegueWithIdentifier("error", sender: self)
            let defaults = NSUserDefaults.standardUserDefaults()
            defaults.setBool(false,forKey:"l"+String(level)+"q"+String(quiz))
            defaults.setBool(false,forKey:"l"+String(level)+"p")
        }
        dispatch_async(dispatch_get_main_queue(), {
            self.restore()
        })
    }
    if (flag1==0){
        ques = 1
    }
    questions()
    println(ql)

    super.viewDidLoad()

//加载视图后执行任何其他设置。}

您的(可能是长时间运行的)查询作为后台任务运行,因此会立即调用restore()。你必须改变两件事:

  1. 将对restore()的调用置于后台执行块中
  2. 牢记"规律":UI元素的更新必须在主线程中完成

所以,对于2。您必须将restore()封装在主线程中:

dispatch_async(dispatch_get_main_queue(), {
    restore()
})

ActivityIndicator从pause函数开始,到restore函数结束。在viewDidLoad中,大部分工作由您定义的块执行,该块在后台运行。从pauserestore的时间将很小。restore将在您的块完成执行之前很久运行。

如果你想让微调器一直运行到区块结束,你需要做一些类似的事情

println("Successfully retrieved (objects.count) scores.")
restore()

在你的街区里。但是,请注意,我不确定您的块在哪个线程上执行,也不确定从后台线程调用restore是否正确。你可以试试。

最新更新