UIActivityIndicatorView不呈现
我有一个应用程序,使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树形图,并基本告诉你在activityIndicator视图的位置..你可能做了一个不正确的假设。
更改
[activityStatus bringSubviewToFront:self.view];
至
[self.view bringSubviewToFront:activityStatus];