【问题标题】:UIActivityIndicatorView not renderingUIActivityIndi​​catorView 不呈现
【发布时间】:2013-10-11 14:29:41
【问题描述】:

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

有什么建议吗?谢谢! V

【问题讨论】:

  • 启动和停止activityindicator之间的时间间隔是多少?如果非常少,您将看不到视图。
  • 在 viewDidLoad 视图中还不可见,尝试操作 UI 可能会经常给出未定义的结果。也许尝试在 viewDidAppear 方法中“开始”和“停止”动画指示器。

标签: ios objective-c uiactivityindicatorview


【解决方案1】:

您的问题是您的动画开始被您在 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 机器上从内存中键入此代码。

【讨论】:

  • 不幸的是,当我这样做时,stateGauges 为 nil
  • 你的初始化器在做什么?你没有显示那个代码?您还需要使用 __block 修饰符声明您的状态量表 var,以便您可以在块中对其进行变异。
【解决方案2】:

取出

[activityStatus bringSubviewToFront:self.view];

因为根据docsbringSubviewToFront:

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

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

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

[[activityStatus superview] recursiveDescription]

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

【讨论】:

    【解决方案3】:

    改变

    [activityStatus bringSubviewToFront:self.view];
    

    [self.view bringSubviewToFront:activityStatus];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多