0

试图隐藏和自定义静态单元格的高度。我知道这可能不是最好的方法。如果有人知道更好的方法,请指教。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{

    if (![Mode isEqualToString:@"HIDE"]) {
        if (indexPath.row == 2) {
            return 0.0;
        }
    }

    return "DEFAUlT_HEIGHT";

}

如何从情节提要中获取默认高度?故事板中每个单元格的高度都不同。反正有更好的定制吗?提前致谢。

4

1 回答 1

1

看看这个线程:隐藏静态单元格

它谈到了以编程方式隐藏静态单元格。这是公认的答案:

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 的答案。

于 2012-08-24T08:29:26.677 回答