UIActivityIndicatorView不显示

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服务的对象。

请问如何显示活动指示器视图?谢谢!


你添加了旋转器吗? - TreeTree
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];
        });
    });
}

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];
}

那么,我可以使用类似这样的代码向活动指示器添加一些文本吗?谢谢! - Pheepster
是的,不要忘记在 -viewDidLoad 方法中初始化您的视图层次结构,这是最佳实践。不要使用 -viewWillAppear 来完成此操作。 - Roman Kabachenko

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接