1

我有一个应用程序可以调用 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];
}

有什么建议么?谢谢!五

4

3 回答 3

2

您的问题是您的动画开始被您在 GuagesList 初始化程序中所做的任何事情所阻止。

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

最好的解决方案是使用 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];         
   });
});

您需要验证代码,因为我必须在 Windows 机器上从内存中键入它。

于 2013-10-11T14:51:13.553 回答
0

取出

[activityStatus bringSubviewToFront:self.view];

因为根据文档 bringSubviewToFront:

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

这不是你想要的。(另一个答案建议您[self.view bringSubviewToFront:activityStatus]改为这样做......这很好,但通常这个调用是多余的,b/c 无论如何都会[self.view addSubview:activityStatus]将 activityStatus 添加到 self.view 子视图数组中视图的末尾)

如果那仍然不起作用..基本上在您开始制作动画后立即设置一个断点,然后在控制台中输入:

[[activityStatus superview] recursiveDescription]

recursiveDescription会给你一个 UI 树形图,基本上告诉你 activityIndi​​cator 视图的确切位置。你可能对某事做出了错误的假设。

于 2013-10-11T14:41:40.587 回答
0

改变

[activityStatus bringSubviewToFront:self.view];

[self.view bringSubviewToFront:activityStatus];
于 2013-10-11T14:45:45.770 回答