我有一个带有表视图控制器的应用程序,其中用户选择US状态,调用Web服务并在目标表视图控制器中显示该状态的数据。由于Web服务可能需要一些时间才能完成,因此我需要一个活动指示器。由于不会显示临时数据,我需要同步处理。所以我的任务非常简单:启动活动指示器,调用Web服务,完成后,停止活动指示器。
我显然做错了什么,并且没有显示任何活动指示。
以下是我的目标表视图控制器的viewDidAppear方法的代码:
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
[self.tableView bringSubviewToFront:spinner];
spinner.hidesWhenStopped = YES;
spinner.hidden = NO;
[spinner startAnimating];
stateGauges = [[GaugeList alloc] initWithStateIdentifier:stateIdentifier andType:nil];
[self.tableView reloadData];
[spinner stopAnimating];
}
部首:
@property (strong, nonatomic) UIActivityIndicatorView *spinner;
GaugeList是调用Web服务的对象。
有人可以告诉我如何显示活动指示器视图吗?谢谢!
答案 0 :(得分:12)
您忘记在表格视图中添加微调器。您的代码应如下所示:
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
spiner.center = //set some center
[self.tableView addSubview: spinner];
[self.tableView bringSubviewToFront:spinner];
spinner.hidesWhenStopped = YES;
spinner.hidden = NO;
[spinner startAnimating];
stateGauges = [[GaugeList alloc] initWithStateIdentifier:stateIdentifier andType:nil];
[self.tableView reloadData];
[spinner stopAnimating];
}
您还可以在主线程中向Web服务发送请求。这是不好的做法。我建议如下:
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
spiner.center = //set some center
[self.tableView addSubview: spinner];
[self.tableView bringSubviewToFront:spinner];
spinner.hidesWhenStopped = YES;
spinner.hidden = NO;
[spinner startAnimating];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
stateGauges = [[GaugeList alloc] initWithStateIdentifier:stateIdentifier andType:nil];
dispatch_async(dispatch_get_main_queue(), ^{
[self.tableView reloadData];
[spinner stopAnimating];
});
});
}
答案 1 :(得分:1)
首先,您应该将活动指示符添加到某个视图以显示它。但是你不能将它添加到UITableView,因为UITableView是UIScrollView的子类,你会看到浮动活动指示器。在您的情况下,最好的方法是将活动指示器添加到导航栏等。或者如果要禁用表视图,您应该写这样的内容:
- (void)viewDidLoad {
[super viewDidLoad];
UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
UIView *dummyView = [[UIView alloc] init];
dummyView.frame = self.tableView.bounds;
dummyView.alpha = 0.5f;
dummyView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
dummyView.userInteractionEnabled = YES;
dummyView.backgroundColor = [UIColor blackColor];
[dummyView addSubview:activityIndicator];
activityIndicator.center = dummyView.center;
[self.tableView addSubview:dummyView];
}
答案 2 :(得分:0)
尝试使用self.spinner
而不是spinner
。