我有一个UITableView,我可以使用节标题来展开或折叠该节。在我的特定示例中,每个部分只有一行,可见(扩展部分)或隐藏(部分折叠)。 作为节头我使用自定义UITableViewHeaderFooterView - HeaderAccountView。我在Interface Builder中创建了* .xib文件,并将其自定义类设置为我的HeaderAccountView(仍在IB字段中)。
在我的HeaderAccountView.h和HeaderAccountView.m文件中,init
方法或smth没有任何更改 - 只有一些功能可以突出显示self(选定的部分)等。
在我的主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;
}
效果更好 - 但现在我有另一个问题 - 当我回到我的第一个(真正的)选定和突出显示的部分时 - 它显然没有突出显示。
感谢您的帮助,如果是基本问题,请致谢。
答案 0 :(得分:2)
您必须手动保留所选标头索引的列表。
接下来,在视图控制器中实现方法tableView:willDisplayHeaderView:以在显示时刷新标题。
- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section
{
view.selectedBackground.alpha = ([_highlightedHeadersList containsObject:@(section)] ? 0.0f : 1.0f);
}
你必须在_highlightedHeadersList中添加/删除索引。
答案 1 :(得分:0)
我使用以下方法完成了此操作。在表视图控制器中,我创建了一个属性(NSInteger),并将其命名为sectionForSelectedHeader。最初将其设置为-1,因此最初不会选择任何部分。
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
RDHeader *header = [tableView dequeueReusableHeaderFooterViewWithIdentifier:@"Header"];
header.tag = section;
if (header.gestureRecognizers.count == 0) {
UITapGestureRecognizer *tapper = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(headerSelected:)];
[header addGestureRecognizer:tapper];
}
header.selected = (self.sectionForSelectedHeader == section)? 1 : 0;
return header;
}
-(void)headerSelected:(UITapGestureRecognizer *) tapper {
if ([(RDHeader *)tapper.view selected] != 1) {
self.sectionForSelectedHeader = tapper.view.tag;
}else{
self.sectionForSelectedHeader = -1;
}
[self.tableView reloadData];
}
然后在我的自定义头子类中,我有一个方法setSelected :(在RDHeader类中选择了一个NSInteger属性),如下所示:
-(void)setSelected:(NSInteger)selected {
_selected = selected;
if (selected) {
self.contentView.backgroundColor = [UIColor orangeColor];
}else{
self.contentView.backgroundColor = [UIColor yellowColor];
}
}