4

我有一个带有表格视图控制器的应用程序,其中用户选择美国州,调用 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 服务调用的对象。

有人能告诉我如何让活动指示器视图出现吗?谢谢!

4

3 回答 3

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];
        });
    });
}
于 2013-10-23T18:29:45.063 回答
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];
}
于 2013-10-23T18:55:00.980 回答
0

尝试使用self.spinner而不是使用spinner.

于 2013-10-23T18:27:26.323 回答