私はその解決策を見つけようとしていて、たくさんのフォーラムを読んでいますが、私は欲しいものを手に入れることができませんでした。アクティビティインジケーターとテーブルビューコントローラーがどのように機能するかを理解した後、次の解決策を思いつきました。
何らかの理由で、tableReloadまたはその他の高価なプロセスと同じスレッドでアクティビティインジケーターを開始しようとすると、アクティビティインジケーターは実行されません。別のスレッドでテーブルの再読み込みやその他の操作を実行しようとすると、安全ではなく、エラーや望ましくない結果が生じる可能性があります。したがって、別のスレッドでアクティビティインジケーターを表示するメソッドを実行できます。
また、このソリューションをMBProgressHUDと組み合わせて、アクティビティインジケーター付きのビューよりも見栄えのするものを提示しました。いずれの場合も、activityViewの外観をカスタマイズできます。
-(void)showActivityViewer
{
AppDelegate *delegate = [[UIApplication sharedApplication] delegate];
UIWindow *window = delegate.window;
activityView = [[UIView alloc] initWithFrame: CGRectMake(0, 0, window.bounds.size.width, window.bounds.size.height)];
activityView.backgroundColor = [UIColor blackColor];
activityView.alpha = 0.5;
UIActivityIndicatorView *activityWheel = [[UIActivityIndicatorView alloc] initWithFrame: CGRectMake(window.bounds.size.width / 2 - 12, window.bounds.size.height / 2 - 12, 24, 24)];
activityWheel.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhite;
activityWheel.autoresizingMask = (UIViewAutoresizingFlexibleLeftMargin |
UIViewAutoresizingFlexibleRightMargin |
UIViewAutoresizingFlexibleTopMargin |
UIViewAutoresizingFlexibleBottomMargin);
[activityView addSubview:activityWheel];
[window addSubview: activityView];
[[[activityView subviews] objectAtIndex:0] startAnimating];
}
-(void)hideActivityViewer
{
[[[activityView subviews] objectAtIndex:0] stopAnimating];
[activityView removeFromSuperview];
activityView = nil;
}
- (IBAction)reloadDataAction:(id)sender {
[NSThread detachNewThreadSelector:@selector(showActivityViewer) toTarget:self withObject:nil];
//... do your reload or expensive operations
[self hideActivityViewer];
}