UIActivityView Swift无法正常纠正?

时间:2015-11-10 22:01:08

标签: ios swift uiactivityindicatorview

@IBAction func getData(sender: AnyObject) {

    activitySpinner.startAnimating();
    activitySpinner.hidden = false;

    edisonArray[0].EdisonLocation = edison1Location.text!;
    edisonArray[1].EdisonLocation = edison2Location.text!;
    edisonArray[2].EdisonLocation = edison3Location.text!;
    edisonArray[3].EdisonLocation = edison4Location.text!;
    edisonArray[4].EdisonLocation = edison5Location.text!;


    edisonArray[0].EdisonComment = edison1Comment.text!;
    edisonArray[1].EdisonComment = edison2Comment.text!;
    edisonArray[2].EdisonComment = edison3Comment.text!;
    edisonArray[3].EdisonComment = edison4Comment.text!;
    edisonArray[4].EdisonComment = edison5Comment.text!;

    for(var i = 0; i < edisonArray.count ; i++){

        var edison = edisonArray[i];
        edison = startDataCollection(edison);
        edisonArray[i] = edison;

    }

    edison1Data.text = "True"
    edison2Data.text = "True"
    edison3Data.text = "True"
    edison4Data.text = "True"
    edison5Data.text = "True"



    if(!edisonArray[0].EdisonBool) { edison1Data.text = "False" }
    if(!edisonArray[1].EdisonBool) { edison1Data.text = "False" }
    if(!edisonArray[2].EdisonBool) { edison1Data.text = "False" }
    if(!edisonArray[3].EdisonBool) { edison1Data.text = "False" }
    if(!edisonArray[4].EdisonBool) { edison1Data.text = "False" }


    activitySpinner.stopAnimating();
    activitySpinner.hidden = true;

}

上面的代码适用于我正在进行的项目。每次运行此代码时,我都试图让活动微调器工作,微调器不是动画。有人可以帮我这个。

activitySpinner是UIActivityIndi​​catorView的对象

2 个答案:

答案 0 :(得分:1)

您正在主线程中运行您的工作。这将阻止动画正常工作。此外,您在runloop的同一帧上调用start和stop动画。这也可能导致它没有动画。

最后,您无法更新后台线程的用户界面。因此,如果您正在使用UIKit控件,则需要在主线程上执行此操作。

Matt指出了在主线程上再次调用的正确方法。但我怀疑整个工作流程看起来像这样

     activitySpinner.startAnimating();
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);())
     { 
        //do any slow operations here in the background queue
        doProcess();

        //move back to the ui thread
        dispatch_async(dispatch_get_main_queue())
        { 
           //update any user interface info based on the above processing  
           updateUi();
           activitySpinner.stopAnimating();

         }
     }

答案 1 :(得分:0)

像这样:

@IBAction func getData(sender: AnyObject) {
    activitySpinner.startAnimating();
    dispatch_async(dispatch_get_main_queue()) { // <--
         activitySpinner.hidden = false;
         edisonArray[0].EdisonLocation = edison1Location.text!;
         // ...
         activitySpinner.stopAnimating();
         activitySpinner.hidden = true;
    }
}

但请注意,这不会使您的代码正确。如果startDataCollection非常耗时,则不应在主线程上执行此操作。但是,这是另一个问题。