为啥我的 UIActivityIndi​​catorView 只显示一次?

Posted

技术标签:

【中文标题】为啥我的 UIActivityIndi​​catorView 只显示一次?【英文标题】:Why does my UIActivityIndicatorView only display once?为什么我的 UIActivityIndi​​catorView 只显示一次? 【发布时间】:2010-03-24 13:39:02 【问题描述】:

我正在开发一个 iPhone 应用程序,该应用程序具有基于标签栏的导航,带有五个标签。每个选项卡都包含一个 UITableView,其数据是远程检索的。理想情况下,我想使用在此远程检索期间启动/停止的单个 UIActivityIndi​​catorView(窗口的子视图) - 每个选项卡一次。

这是我在 AppDelegate 中设置微调器的方法:

- (void)applicationDidFinishLaunching:(UIApplication *)application     
  [window addSubview:rootController.view];

  activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
  [activityIndicator setCenter:CGPointMake(160, 200)];
  [window addSubview:activityIndicator];

  [window makeKeyAndVisible];

由于我的选项卡都执行类似的功能,我创建了一个基类,我的所有选项卡的 ViewController 都继承自该基类。这是我用来进行远程检索的方法:

- (void)parseXMLFileAtURL:(NSString *)URL 
  NSAutoreleasePool *apool = [[NSAutoreleasePool alloc] init];

  AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

  NSLog(@"parseXMLFileAtURL started.");
  [appDelegate.activityIndicator startAnimating];
  NSLog(@"appDelegate.activityIndicator: %@", appDelegate.activityIndicator);

  articles = [[NSMutableArray alloc] init];

  NSURL *xmlURL = [NSURL URLWithString:URL];

  rssParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL];
  [rssParser setDelegate:self];
  [rssParser setShouldProcessNamespaces:NO];
  [rssParser setShouldReportNamespacePrefixes:NO];
  [rssParser setShouldResolveExternalEntities:NO];
  [rssParser parse];

  NSLog(@"parseXMLFileAtURL finished.");
  [appDelegate.activityIndicator stopAnimating];

  [apool release];

这个方法被每个视图控制器调用如下:

- (void)viewDidAppear:(BOOL)animated 
  [super viewDidAppear:animated];

  if ([articles count] == 0) 
    NSString *path = @"http://www.myproject.com/rss1.xml";
    [self performSelectorInBackground:@selector(parseXMLFileAtURL:) withObject:path];
  

这在应用程序加载第一个选项卡的内容时非常有用。我看到的是空桌子和旋转器。内容一加载,微调器就会消失。

奇怪的是,当我单击第二个选项卡时,来自 -parseXMLFileAtURL: 方法的 NSLog 消息显示在日志中,但屏幕挂在第一个选项卡的视图上,我看不到微调器。内容下载完成后,就会出现第二个选项卡的视图。

我怀疑这与线程有关,我仍然很熟悉。我在这里做错了什么吗?

【问题讨论】:

【参考方案1】:

您应该使用以下命令对主线程上的活动指示器执行所有操作:

performSelectorOnMainThread:withObject:waitUntilDone:

【讨论】:

谢谢,迪德里克。我按照你的建议让微调器工作了,虽然我花了一些时间,因为我还有其他一些错误。

以上是关于为啥我的 UIActivityIndi​​catorView 只显示一次?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 UIActivityIndi​​cator 在 UIButton 中以负 x 坐标作为子视图

为啥是UIActivityIndi​​catorView!展开时为零?

如何将 UIActivityIndi​​cator 添加到我的应用程序的启动画面?

UIActivityIndi​​catorView 不会在正确的时间停止

UIActivityIndi​​catorView 不工作(获取影响 UIActivityIndi​​catorView 的 Facebook 权限)

UIActivityIndi​​catorView 正确使用