嵌套的UITableVIew heightForRowAtIndexPath

时间:2014-02-24 14:53:23

标签: ios objective-c uitableview

我正在努力弄清楚如何优化性能并提高代码质量。 我有以下布局:

OuterTableView
 Outer Cell
  UILabel (title label)
  InnerTableView
   Inner Cell (item cell)
   Inner Cell (item cell)
   ...

此布局的目的是可扩展的外部表。在崩溃状态下,只有UILabel(仅标题标签)可见。当用户点击外部单元格时,单元格会扩展并显示内部单元格。

外部表控制器中,我有3个功能(简化):

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    if (tableView == self.tableView) {
        // ServiceGroupCell - outer cell
        ServiceGroupCell *serviceCell = [tableView dequeueReusableCellWithIdentifier:@"service_group_cell"];
        [self configureCell:serviceCell forIndexPath:indexPath];
        return serviceCell;
    }

    return nil;
}

- (void) configureCell:(ServiceGroupCell *) cell forIndexPath:(NSIndexPath *) indexPath {
    // styling for outer cell and passing data for inner cells
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    ServiceGroupCell *serviceGroupCell = [tableView dequeueReusableCellWithIdentifier:@"service_group_cell"];
    [self configureCell:serviceGroupCell forIndexPath:indexPath];
    [serviceGroupCell layoutSubviews];

    CGFloat height = [serviceGroupCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;

    return height;
}

内部表控制器

- (void)layoutSubviews {
    [self.cellTableView layoutSubviews];
    // set height constraint for inner table view
    self.heightLayoutConstraint.constant = self.cellTableView.contentSize.height;
}

我有疑问: 1)如您所见,对于外表的每个单元格,configureCell被调用两次。有没有办法缓存或只调用一次? 2)systemLayoutSizeFittingSize返回0.有什么想法吗?

2 个答案:

答案 0 :(得分:0)

  

2)systemLayoutSizeFittingSize返回0.有什么想法吗?

您的约束可能已丢失。确保在.xib文件中指定单元格宽度和高度的约束。

答案 1 :(得分:-1)

我想,细胞内部的其他细胞是个坏主意。您可以创建一些部分,并使用方法didSelectRowAtIndexPath,当用户点击部分中的单元格时,将细胞添加到此部分。或者使用带有自定义nsview的scrollview,其中放入tableview。多数民众赞成只是解决。

有没有办法缓存或只调用一次? - 尝试willDisplayCell方法。