我正在重用标题,将它们保存在字典中,其中节号是键,标题视图是值。
在我动画删除了一个部分并重新加载另一个部分后,只有这些部分的标题视图“消失了”。经过一番搜索,我发现这些标题视图的框架已更改。从屏幕宽度 (320) 向右移位器Frame.X
删除的部分的标题视图,以及用移位器重新加载的部分。UITableViewRowAnimationRight
UITableViewRowAnimationAutomatic
Y
主要问题和困惑来自我无法更改这些框架的事实!好吧,它们一开始会发生变化,但在视觉上没有任何变化,并且在另一次调用viewForHeaderInSection:
帧时再次移动。
我是这样做的:
假设我们有 3 个部分,每个层的数据位于数组_first
和之一_second
中_third
。通过按钮的 touchupinside 我们调用handleTouchUp:
. (_second
保持不变)
- (void) handleTouchUp: (UIButton *)sender
{
if ([_first count] == 0) {
sectionCount = 3;
_first = [NSMutableArray arrayWithObjects: @"First 1", @"First 2", nil];
_third = [NSMutableArray arrayWithObjects: @"Third 1", @"Third 2", @"Third 3", @"Third 4", @"Third 5", nil];
[tableView reloadData];
} else {
sectionCount = 2;
[_first removeAllObjects];
_third = [NSMutableArray arrayWithObjects: @"First 1", @"First 2", @"Third 1", @"Third 2",
@"Third 3", @"Third 4", @"Third 5", nil];
[tableView beginUpdates];
[tableView deleteSections: [NSIndexSet indexSetWithIndex: 0] withRowAnimation:UITableViewRowAnimationRight];
[tableView reloadSections: [NSIndexSet indexSetWithIndex: 2] withRowAnimation:UITableViewRowAnimationAutomatic];
[tableView endUpdates];
}
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
NSNumber *key = [NSNumber numberWithInteger: section];
UIView *header = [_headers objectForKey: key];
if (header) {
} else {
header = [[UIView alloc] init];
switch (section) {
//Doing something with header here (e.g. set background color)
}
[_headers setObject:header forKey: key];
}
[header setFrame: CGRectMake(0, 0, 320, 25)];
return header;
}
更新: 项目中可能还有其他一些错误,但这并不重要——它是测试项目。唯一重要的问题是无效的标题视图。删除无效视图并创建新视图不是解决方案——它扼杀了重用标题视图的意义。