看看这个线程:隐藏静态单元格
它谈到了以编程方式隐藏静态单元格。这是公认的答案:
1.隐藏单元格
没有办法直接隐藏单元格。UITableViewController 是提供静态单元格的数据源,目前没有办法告诉它“不提供单元格 x”。所以我们必须提供我们自己的数据源,它委托给 UITableViewController 以获取静态单元格。
最简单的方法是继承 UITableViewController,并覆盖所有在隐藏单元格时需要表现不同的方法。
在最简单的情况下(单节表,所有单元格具有相同的高度),这将是这样的:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [super tableView:tableView numberOfRowsInSection:section] - numberOfCellsHidden; }
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// Recalculate indexPath based on hidden cells
indexPath = [self offsetIndexPath:indexPath];
return [super tableView:tableView cellForRowAtIndexPath:indexPath]; }
- (NSIndexPath*)offsetIndexPath:(NSIndexPath*)indexPath {
int offsetSection = indexPath.section; // Also offset section if you intend to hide whole sections
int numberOfCellsHiddenAbove = ... // Calculate how many cells are hidden above the given indexPath.row
int offsetRow = indexPath.row + numberOfCellsHiddenAbove;
return [NSIndexPathindexPathForRow:offsetRow inSection:offsetSection]; }
如果您的表格有多个部分,或者单元格的高度不同,则需要覆盖更多方法。同样的原则也适用于这里:您需要在委托给 super 之前偏移 indexPath、section 和 row。
还要记住,didSelectRowAtIndexPath: 等方法的 indexPath 参数对于同一个单元格会有所不同,具体取决于状态(即隐藏单元格的数量)。因此,始终偏移任何 indexPath 参数并使用这些值可能是一个好主意。
2.动画变化
正如 Gareth 已经说过的,如果使用 reloadSections:withRowAnimation: 方法对更改进行动画处理,则会出现重大故障。
我发现如果你立即调用 reloadData: ,动画会得到很大改善(只剩下小故障)。动画后表格正确显示。
所以我正在做的是:
- (void)changeState {
// Change state so cells are hidden/unhidden
...
// Reload all sections
NSIndexSet* reloadSet = [NSIndexSetindexSetWithIndexesInRange:NSMakeRange(0, [self numberOfSectionsInTableView:tableView])];
[tableView reloadSections:reloadSet withRowAnimation:UITableViewRowAnimationAutomatic];
[tableView reloadData]; }
如果这有帮助,请去那里投票 henning77 的答案。