UIActivityIndi​​catorView不呈现

我有一个应用程序,使Web服务调用来获取数据。 我想添加一个活动指标,当应用程序正在获取Web服务数据时可见。 我已经看了其他职位,虽然我相信我正在做的职位推荐,我的指标不会在屏幕上呈现。 使Web服务调用的对象是stateGauges。 这是我的代码:

- (void)viewDidLoad { [super viewDidLoad]; UIActivityIndicatorView *activityStatus = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(120, 230, 50, 50)]; activityStatus.center = self.view.center; [self.view addSubview:activityStatus]; [activityStatus bringSubviewToFront:self.view]; [UIApplication sharedApplication].networkActivityIndicatorVisible = TRUE; [activityStatus startAnimating]; stateGauges = [[GaugeList alloc] initWithStateIdentifier:stateIdentifier andType:nil]; [activityStatus stopAnimating]; } 

有什么build议么? 谢谢! V

你的问题是你的animation开始被你的GuagesList初始化器所做的任何事情阻塞。

当您告诉活动指示器开始animation时,它不会立即渲染到屏幕上,而是将视图标记为在下一轮运行循环中需要更新。 您的初始化程序然后阻塞线程直到完成,您调用stopAnimating,然后线程有机会更新指标。 它已经设置为不animation的点。

最好的解决scheme是使用GCD在另一个线程上执行初始化程序。 在调用stopAnimating之前,一定要切换回前台线程。

通常的模式是做类似的事情:

 [activityStatus startAnimating]; // enqueue it dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ stateGauges = [[GaugeList alloc] initWithStateIdentifier:stateIdentifier andType:nil]; // now switch back to main thread dispatch_async(dispatch_get_main_queue(), ^{ [activityStatus stopAnimating]; }); }); 

您需要validation代码,因为我必须在Windows机器上从内存中input此代码。

取出

 [activityStatus bringSubviewToFront:self.view]; 

因为根据文档 bringSubviewToFront:

移动指定的子视图,使其出现在其兄弟之上。

这不是你想要的。 (另一个答案build议你[self.view bringSubviewToFront:activityStatus]来代替..这很好,但通常这个调用是多余的,b / c [self.view addSubview:activityStatus]将activityStatus添加到自我视图的末尾.view子视图数组反正)

如果这仍然无法正常工作..基本上刚刚开始animation后放置一个断点,然后键入到控制台:

 [[activityStatus superview] recursiveDescription] 

recursion描述将给你一个UI树形图,并基本告诉你在activityIndi​​cator视图的位置..你可能做了一个不正确的假设。

更改

 [activityStatus bringSubviewToFront:self.view]; 

 [self.view bringSubviewToFront:activityStatus];