如何在UITableViewController中以代码添加活动指示器?添加后不显示该怎么办?
嗨,我来帮你搞定这两个关于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]; });
你踩的这个坑很典型!因为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

