2

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

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

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

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

谢谢!

4

2 回答 2

3

一般来说,从外部乱搞UITableViewCella 拥有的对象并不是一个好主意UITableView,因为你要得到的单元格在滚出屏幕后可能会被回收,所以即使你添加一个活动指示器,它可能会被删除。

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

本质上,模型需要成为状态的守护者。与更改UIView子类有关的所有事情都需要在tableView:cellForRowAtIndexPath:. 最后,当状态需要改变时,控制器应该给你的表视图“轻拍肩膀”。

于 2013-01-31T15:08:36.317 回答
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]];
于 2013-01-31T15:01:45.377 回答