我一直在努力寻找解决方案并阅读了很多论坛,但我没有得到我想要的。在了解了活动指示器和表格视图控制器的工作原理后,我想出了以下解决方案。
出于某种原因,如果您尝试使用 tableReload 或任何其他昂贵的进程在同一线程上启动活动指示器,则活动指示器永远不会运行。如果您尝试在另一个线程中运行 table reload 或其他一些操作,那么它可能不安全并且可能会产生错误或不需要的结果。所以我们可以在另一个线程上运行显示活动指示器的方法。
我还将此解决方案与 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];
}