在表格视图单元格顶部显示指示器视图

时间:2013-01-31 14:58:04

标签: ios objective-c cocoa-touch uitableview uiactivityindicatorview

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

我尝试了以下代码,但未显示任何活动指示符:

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

我的代码出了什么问题?实现这个更好的方法是什么?如何在半透明视图中显示指标视图,该视图覆盖表格视图单元格?

谢谢!

2 个答案:

答案 0 :(得分:3)

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

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

基本上,模型需要成为国家的守护者。与更改UIView子类有关的所有内容都需要在tableView:cellForRowAtIndexPath:中进行。最后,控制器应该给你的桌子视图"轻敲肩膀"当国家需要改变时。

答案 1 :(得分:2)

从它的外观来看,你永远不会将你创建的UIView添加到你的单元格中。您可能希望执行以下操作:

[cell.contentView addSubview:view];

此外,您可能希望将添加到单元格的视图框架更改为与实际单元格不同的框架。这样您就可以在UITableView内滚动,而不会打扰您设置的工作人员视图。

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, cell.contentView.frame.size.width, cell.contentView.frame.size.height)];

使视图半透明:

[view setOpaque:YES];
[view setBackgroundColor:[UIColor colorWithWhite:1.0 alpha:0.5]];
相关问题