ios中為耗時動作新增indicatorview不可見問題及解決
阿新 • • 發佈:2019-01-24
作為一個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
}
謝謝!!