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