2

我有两个视图控制器 - 我将简单地称它们为 A 和 B 以帮助您轻松理解。

视图控制器有一个通过情节提要链接到 B 的按钮(未手动编码)。并且,B 视图控制器在 viewDidLoad 方法中从数据库服务器检索一堆 json 数据。因为检索 json 数据需要一些时间,所以我需要添加一个活动指示器,让用户知道它正在做某事——而不是冻结。但是,我不太确定应该在哪里添加活动指示器视图。

如果你在我的鞋子里,你会在哪里添加它?

4

3 回答 3

2

使用普通界面生成器将其放置在您希望看到的位置,并将hidesWhenStopped变量设置为YES在您完成获取数据后不可见。然后告诉它在你的 JSON 回调中停止。

在设计方面,“完成的事情”是将它放在正在加载的任何东西的中间。对于图像,这将是显示图像的中间位置。对于表格,您可能会在屏幕中间或一个空的“占位符”单元格上找到一个大型活动指示器。想想用户的眼睛会去哪里尝试查看他们想要的数据,那是他们应该看到指示器的地方。

于 2012-12-17T17:13:29.393 回答
1

我会在标题中使用带有消息的警报视图,然后将子视图添加到警报中,即活动指示器。

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Doing something\nPlease Wait..." message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:nil, nil];
UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
[alertView show];
indicator.center = CGPointMake(alertView.bounds.size.width / 2, alertView.bounds.size.height - 50);
[alertView addSubview:indicator];
[indicator startAnimating];

稍后在代码中解雇...

[alert dismissWithClickedButtonIndex:0 animated:YES];
于 2012-12-17T17:13:59.440 回答
1

如果您在 viewDidLoad 中有一个阻塞调用,这将导致 UI 在移动到 B 之前冻结在 A 上,那么我建议在 A 上添加活动指示器。尽管您可能会注意到由于对 DB 的阻塞调用,您的 UI 会立即更改在阻塞调用也被冻结之前,您不会看到任何 UI 更改。

我通常处理这个问题的方法是为阻塞调用生成一个新线程,从而释放 UI 的主线程,然后在必要时添加一个活动指示器(在 A 或 B 上取决于设计,但我建议在此在 B 上显示它来自可用性 POV 的案例)。

为了避免自己管理这一切的麻烦,我通常最终使用类似MBProgressHUD或类似的库,它们更容易管理。

于 2012-12-17T18:03:16.633 回答