You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在UITableViewController中以代码添加活动指示器?添加后不显示该怎么办?

嗨,我来帮你搞定这两个关于UITableViewController添加活动指示器的问题,都是开发中常见的小坑,给你详细拆解下:

1. 如何以编程方式为UITableViewController添加活动指示器视图?

步骤很清晰,分这几步来就行:

  • 第一步:声明活动指示器属性
    在你的UITableViewController类里(不管是.h文件还是.m的延展中)先声明一个强引用属性,方便后续调用:

    @property (nonatomic, strong) UIActivityIndicatorView *activityIndicator;
    
  • 第二步:初始化并配置指示器
    在viewDidLoad方法里创建实例,设置样式、颜色、位置这些参数:

    - (void)viewDidLoad {
        [super viewDidLoad];
        
        // 选择合适的样式,Large适合全局加载,Medium适合局部场景
        self.activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleLarge];
        // 自定义颜色(可选,默认是系统灰色)
        self.activityIndicator.color = [UIColor systemBlueColor];
        // 设置为屏幕居中,这个位置最符合用户对全局加载的预期
        self.activityIndicator.center = self.view.center;
        // 设置停止动画时自动隐藏,省去手动处理隐藏的逻辑
        self.activityIndicator.hidesWhenStopped = YES;
    }
    
  • 第三步:添加到父视图并启动动画
    这部分是关键,后面会详细说父视图的选择,先看代码:

    // 添加到合适的父视图,这里先给出正确的方式
    [self.view.superview addSubview:self.activityIndicator];
    // 启动动画
    [self.activityIndicator startAnimating];
    
  • 第四步:数据加载完成后停止动画
    等异步请求或者数据处理完成后,记得在主线程停止动画并刷新表格:

    // 比如在数据回调方法里
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.activityIndicator stopAnimating];
        [self.tableView reloadData];
    });
    
2. 为什么添加到self.view没显示?正确的父视图是哪个?

你踩的这个坑很典型!因为UITableViewController的self.view本质就是UITableView,当你把指示器添加到这个tableView上时,一旦tableView开始加载cell或者滚动,指示器很容易被tableView的contentView或者cell遮挡住,所以才会看不到。

推荐两种正确的父视图选择方案:

  • 方案一:添加到self.view的superview
    这个容器视图是用来承载tableView的,把指示器加在这里,它会始终处于tableView的上层,不会被cell遮挡,而且位置不会随着tableView滚动而偏移,完美适配全局加载场景:

    [self.view.superview addSubview:self.activityIndicator];
    
  • 方案二:添加到tableView但强制置顶
    如果你一定要把指示器放在tableView上,记得调用bringSubviewToFront确保它在最上层,但这种方式要注意:当tableView滚动时,指示器的位置会跟着滚动偏移,更适合局部加载(比如下拉刷新这类场景):

    [self.tableView addSubview:self.activityIndicator];
    [self.tableView bringSubviewToFront:self.activityIndicator];
    

另外,如果你的UITableViewController是放在导航控制器里的,也可以把指示器添加到self.navigationController.view,效果和superview类似,也是全局居中且不被遮挡。


内容的提问来源于stack exchange,提问作者Austin Berenyi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:36:08