我有一个UITableView,其中有节标题可以点击以展开或折叠该节。在我的特定示例中,每个节只有一行,它是可见的(展开的部分)或隐藏的(折叠的部分)。
作为节标题,我使用自定义UITableViewHeaderFooterView-HeaderAccountView。我在Interface Builder上创建了* .xib文件,并将其自定义类设置为我的HeaderAccountView(仍位于IB字段)。

在我的HeaderAccountView.h和HeaderAccountView.m文件中,对init方法或诸如此类的任何东西都没有任何更改-只有一些功能突出显示了自己(选定部分)等。

在我的主要ViewController .m文件中

- (void)viewDidLoad
      {
      [super viewDidLoad];
      .........
      .........

       UITableView *tableView = (id)[self.view viewWithTag:1];
       UINib *nib= [UINib nibWithNibName:@"HeaderAccountView" bundle:nil];
       [tableView registerNib:nib forHeaderFooterViewReuseIdentifier:@"HeaderCell"];


      }

然后
  - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
  {
         HeaderAccountView *headerView = [tableView dequeueReusableHeaderFooterViewWithIdentifier:@"HeaderCell"];
      if (headerView==nil)
      {            headerView = [[HeaderAccountView alloc]
             initWithReuseIdentifier:@"HeaderCell"];
       }
   return headerView;
 }

当我正在运行项目时,一切正常-部分加载了所需的数据,当部分收到水龙头时-它高亮显示(如标准单元格)。

但是,例如,当我从选定的突出显示部分中将tableview滚动到底部时,该突出显示的部分在视图中已经不可见-从底部出现的该部分已经突出显示了!

我知道这是因为它会创建我的HeaderAccountView的新实例,并将BOOL selected属性设置为YES。

但是我对Objective-C(和编码)是陌生的,并且不了解如何正确解决这个问题。

我试图像这样使用自定义UITableViewHeaderFooterView的prepareForReuse方法
  HeaderAccountView.m:
  -(void) prepareForReuse
  {
      self.selectedBackground.alpha = 0;
  }

它工作得更好-但现在我又遇到了另一个问题-当我返回到第一个(真正)选中并突出显示的部分时-它显然没有突出显示。

感谢您的任何帮助,如果是基本问题,则深表歉意。

最佳答案

您必须手动保留所选标题索引的列表。

接下来,在视图控制器中实现方法tableView:willDisplayHeaderView:,以在显示标题时刷新标题。

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section
{
    view.selectedBackground.alpha = ([_highlightedHeadersList containsObject:@(section)] ? 0.0f : 1.0f);
}

并且您必须在_highlightedHeadersList中添加/删除索引。

关于ios - 正确的子类化和UITableViewHeaderFooterView的重用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18431543/

10-09 03:34