ios - 在表格 View 单元格顶部显示指示器 View

标签 ios objective-c cocoa-touch uitableview uiactivityindicatorview

当在后台处理特定于 TableView 单元格的某些数据时,我想将 TableView 单元格的 View 置于半透明模式,并将进度指示器 View 放在 TableView 单元格的顶部。

我尝试了以下代码,但没有显示事件指示器:

-(void)showActivityIndicatorInTableView:(UITableView*)tableView 
atIndexPath:(NSIndexPath*)indexPath
{
  UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
  UIView *view = [[UIView alloc] initWithFrame:cell.contentView.frame];
  view.tag = 50;

  UIActivityIndicatorView *ac = [[UIActivityIndicatorView alloc]
     initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
  CGRect frame = view.frame;
  ac.center = CGPointMake(frame.size.width/2, frame.size.height/2);
  [view addSubview:ac];
  [ac startAnimating];
}

我的代码有什么问题吗?实现这一点的更好方法是什么?如何在覆盖表格 View 单元格的半透明 View 中显示指示器 View ?

谢谢!

最佳答案

一般来说,从外部搞乱 UITableView 拥有的 UITableViewCell 对象并不是一个好主意,因为您要获取的单元格可能会滚动离开屏幕后会被回收,因此即使您添加事件指示器,它也可能会被删除。

更好的方法是让您的 cellForRowAtIndexPath: 处理事件指示器的添加和删除。为此,您的模型需要保留应显示事件指示器的索引路径注册表(如果您从不同时打开多个单元格上的事件指示器,则“注册表”可以像单个变量一样简单) 。 cellForRowAtIndexPath 应该读取该注册表,并相应地装饰单元格。当您想要添加事件指示器时,请将相应的索引路径添加到注册表中,并在 TableView 上调用reloadRowsAtIndexPaths:withRowAnimation:。当您需要关闭事件指示器时,从注册表中删除该单元格的索引路径,然后再次重新加载该行。

本质上,模型需要成为状态的守护者。与更改 UIView 子类有关的所有操作都需要在 tableView:cellForRowAtIndexPath: 中进行。最后,当状态需要改变时, Controller 应该给你的 TableView “轻拍一下肩膀”。

关于ios - 在表格 View 单元格顶部显示指示器 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14628709/

相关文章:

iphone - 应用商店的单元测试

objective-c - 为什么标准循环失败时快速枚举有效?

ios - 如何为 UILabel 或 UITextField 文本的大小设置动画?

ios - 如何与 UISearchController 演示/解雇动画一起制作动画?

ios - 如何使 UITextField 始终居中显示在屏幕上?

iphone - 无法识别的类别选择器 SenTestCase

ios - 控制台中的 AFNetworking 崩溃报告

ios - 在 xcode ui test 中运行所有测试类

ios - 使用 json 工具包将 JSon 字符串反序列化为 NSArray

iOS swift : Load new url to a webview after receiving a push notification