ios - 正确的子类化和重用 UITableViewHeaderFooterView

标签 ios objective-c uitableview reuseidentifier

我有一个 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;
 }

当我运行项目时,一切正常 - 部分加载所需的数据,当部分接收点击时 - 它突出显示(如标准单元格)。

但是当我将桌面 View 滚动到底部时,例如从选定的突出显示部分,并且该突出显示的部分在 View 中已经不可见 - 刚刚从底部出现的部分 - 已经突出显示了!

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

但我是 Objective-C(和编码)的新手,不明白如何正确解决这个问题。

我尝试像这样使用自定义 UITableViewHeaderFooterView 的 prepareForReuse 方法

  HeaderAccountView.m:
  -(void) prepareForReuse
  {
      self.selectedBackground.alpha = 0;
  }

效果更好 - 但现在我有另一个问题 - 当我返回到我的第一个(真正)选择和突出显示的部分时 - 它显然没有突出显示。

感谢您的帮助,如果这是一个基本问题,我们深表歉意。

最佳答案

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

接下来,在 View Controller 中实现 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/

相关文章:

ios - CALayer 上的隐式动画没有动画

objective-c - 闹钟设置

ios - 为什么将 char 数组转换为字符串会创建一个 nil 字符串?

php - 如何将 PHP 中的 MySql 数据放入 Cocoa 应用程序 TableView

ios - 当 Image 的数组响应为 null 时,SDWebImage 会导致 TableView 崩溃

ios - 表格 View 在滚动时崩溃

ios - 动态更改数据源导致 deleteRowsAtIndexPaths :indexes to crash

ios - 核心数据更新尝试在 TableView 中显示但不持久

ios - SpriteKit 在暂停后不会恢复

swift - 从 UitableViewCell 中删除所有子图层