18

I have a table view form created using Static Cells in IB/Storyboard. However, I need to hide some of the cells at runtime depending on certain conditions.

I have found a few 'answers; to this question on SO, e.g.

UITableView set to static cells. Is it possible to hide some of the cells programmatically?

.. and they focus on setting the height of the cell / row to 0. This is great, except I now get exceptions from AutoLayout because the constraints can't be satisfied. How do I get around this last problem? Can I temporarily disable Auto-Layout for a subview? Is there a better way to be doing this in iOS7?

4

9 回答 9

14

我发现最好的方法是简单地处理 numberOfRowsInSection、cellForRowAtIndexPath 和 heightForRowAtIndexPath 以选择性地删除某些行。这是我的场景的“硬编码”示例,您可以做一些更聪明的事情来智能地删除某些单元格,而不是像这样硬编码它,但这对于我的简单场景来说是最简单的。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [super tableView:tableView cellForRowAtIndexPath:indexPath];
    if (indexPath.section == 0 && hideStuff) {
        cell = self.cellIWantToShow;
    }
    return cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    CGFloat height = [super tableView:tableView heightForRowAtIndexPath:indexPath];
    if (indexPath.section == 0 && hideStuff) {
        height = [super tableView:tableView heightForRowAtIndexPath:[NSIndexPath indexPathForRow:2 inSection:0]];
    }
    return height;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSInteger count = [super tableView:tableView numberOfRowsInSection:section];

    if (section == 0 && hideStuff) {
        count -= hiddenCells.count;
    }

    return count;
}
于 2013-09-23T03:14:58.623 回答
8

隐藏情节提要上的单元格并将高度设置为 0:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    let cell: UITableViewCell = super.tableView(tableView, cellForRowAtIndexPath:indexPath)
    return cell.hidden ? 0 : super.tableView(tableView, heightForRowAtIndexPath:indexPath)
    }
}
于 2015-04-01T13:25:27.353 回答
3

最简单的方法是更改​​部分和行的高度。这个对我有用。

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    if (section == 3) {
        return 0;
    } else {
        return [super tableView:tableView heightForHeaderInSection:section];
    }
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [super tableView:tableView cellForRowAtIndexPath:indexPath];
    if (indexPath.section == 3) {
        cell.hidden = YES;
        return 0;
    } else {
        cell.hidden = NO;
        return [super tableView:tableView heightForRowAtIndexPath:indexPath];
    }
}
于 2014-03-24T18:38:06.180 回答
3

如果您确保没有触及单元格底部边缘的约束,则自动布局不应出错(在 iOS 6.0、6.1、7.0 上测试)。您仍将“锚定”到顶部边缘,并且必须固定高度。(当然,您可以反过来并锚定到底部。)

如果您的布局同时依赖于顶部和底部边缘位置,则可以以编程方式删除约束(毕竟它们只是对象)。

于 2013-12-28T20:57:58.927 回答
2

犹太洁食方法是使用动态单元格,将行高设置为 0 是一种技巧。静态单元非常方便,但功能有限。

于 2013-09-22T05:20:18.097 回答
1

contentView我设法通过首先以编程方式删除单元格 in的约束viewDidLoad,然后将该单元格的高度设置为 0 in来避免自动布局的异常heightForRowAtIndexPath

于 2014-03-07T08:23:04.683 回答
1

我找到了一种甚至可以让您使用行动画的方法,并且正在使用 iOS 8.3。您只需要实现tableView:numberOfRowsInSection:数据源方法,然后通过 UITableView 方法 insertRowsAtIndexPaths:withRowAnimation:deleteRowsAtIndexPaths:withRowAnimation:添加/删除行。

这是基于UISwitch状态隐藏确切行的示例:

- (IBAction)alowNotif:(id)sender {
    UISwitch *sw = (UISwitch*)sender;
    NSIndexPath *index = [NSIndexPath indexPathForRow:5 inSection:0];
    if ([sw isOn]) {
        [self.tableView insertRowsAtIndexPaths:@[index] withRowAnimation:UITableViewRowAnimationAutomatic];
    }
    else {
        [self.tableView deleteRowsAtIndexPaths:@[index] withRowAnimation:UITableViewRowAnimationAutomatic];
    }
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (![notifications isOn]) {
        return 5;
    }
    return 6;
}

正如@algal 上面提到的,numberOfRowInSection:仍然是UITableViewDataSource方法,所以人们并不简单地知道它会工作多长时间。

于 2015-04-28T23:31:53.337 回答
0

也为 StoryBoard 中的 tableview 实现了这一点。我的单元格嵌入在带有标题的部分中,由 xcode6 IB 中的那个蓝色立方体表示。事实上,如果你实现了 heightForHeaderInSection、heightForFooterInSection 和 titleForHeaderInSection、titleForFooterInSection,你可以在表格显示时访问标题,分别返回 0.0 和 nil,对于 numberOfRowsInSection 返回 0。

基本上一切正常,除了每个单元格隐藏一个 ca. 您隐藏的每个单元格(部分)都保留 10 像素高的垂直空间。知道那可能是什么吗?

于 2015-02-06T09:57:47.663 回答
0

对我来说最好的方法是修改 numberOfRowsInSection 方法。我删除了我不想显示的数据源。对我来说最好的解决方案,因为一切都在一个功能中。

(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if(section==0) {
    NSUInteger productCount = _products.count;
    for(loop trough your data) {
      if(your condition is true)
         productCount--;
      }
    }
    return productCount;
} else
    return self.groups.count;
}
于 2014-04-08T09:24:50.080 回答