1. 程式人生 > >ios中為耗時動作新增indicatorview不可見問題及解決

ios中為耗時動作新增indicatorview不可見問題及解決

        作為一個ios新手,在開發中總是會遇到很多問題。前幾天遇到一個問題就是怎麼在一個耗時動作之前新增一個indicator view(就是那個圓形的進度條,在那邊轉啊轉的,提示使用者程式正在處理某件事)。說實話,我對indicator view一點也不熟,這也是我第一次用它,我也不知道ios中有沒有像android中一樣的handler機制。沒辦法,網上找一下,終於知道indicator view怎麼用了。

        這裡以程式清理快取為例,清理快取是一個耗時動作。那麼需要在開始清理前新增一個提示進度條(indicator view),在完成清理動作後,再自動取消indicator view。

       起先我想的比較簡單,顯示進度條:

    UIView *_view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
    [_view setTag:108];
    [_view setBackgroundColor:[UIColor blackColor]];
    [_view setAlpha:0.5];
    [self.view addSubview:_view];
    
    activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 32.0f, 32.0f)];
    [activityIndicator setCenter:self.view.center];
    [activityIndicator setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleWhite];
    [_view addSubview:activityIndicator];
    [activityIndicator startAnimating];


       然後隱藏進度條:
    [activityIndicator stopAnimating];
    UIView *view = (UIView*)[self.view viewWithTag:108];
    [view removeFromSuperview];
      在顯示進度條和隱藏進度條之間的就是耗時動作了。然後執行程式,發現耗時動作都已經完成了,還沒有看到進度條的顯示。反覆是,發現把耗時動作和隱藏進度條這兩個動作去掉,只留顯示進度條動作,是可以看到進度條的。

       然後我又把耗時動作去掉,用執行緒睡眠代替耗時動作,發現仍然不能看到進度條的顯示效果。

       於是推測這個應該是ios的一種系統機制吧,那麼此時就應該果斷谷歌起來了,如果網上找了一會,果真發現一篇文章:

How to display an activity indicator or other UI before beginning a long task,裡面也提到了這個indicator view不顯示的問題是ios的一種機制。當然文章中只提供瞭解決方法,並沒有深入討論。

        解決方案:         1.將耗時動作和隱藏indicatorview放到另外一個單獨的方法中去。         2.使用performSelector:@selector withObject: afterDelay:來觸發耗時動作。        
- (IBAction) someMethod
{
[theActivityIndicator startAnimating]; //顯示indicator view
[self performSelector: @selector(doSomethingSlow)
withObject: nil
afterDelay: 0];
return;
}

- (void) doSomethingSlow
{
//執行耗時動作
[theActivityIndicator stopAnimating]; //執行完耗時動作之後,隱藏indicator view
}
            謝謝!!