更新行高后,UITableView重复节标题

时间:2015-02-05 01:01:46

标签: ios objective-c uitableview header uitextview

在我的iOS应用程序中,我在tableview单元格中有一个UITextView。

当用户输入的文本所需的帧超出单元格的当前高度时,UITextView以及单元格高度会扩展。

为了实现上述目标,我调用[tableView beginUpdates]后跟[tableView endUpdates]重新加载单元格的高度。

以上是重复的部分标题与展开的单元格重叠。

有没有办法在不调用[tableView reloadData]的情况下解决这个问题?

下面附有一些相关代码:

当文本发生变化时,我会验证文本是否适合当前文本视图,否则单元格会扩展到新的高度:

- (void)textViewDidChange:(UITextView *)textView {

    CGFloat oldTextViewHeight = [(NSNumber *)[self.cachedTextViewHeightsDictionary objectForKey:indexPath] floatValue];

    CGFloat newTextViewHeight = [textView sizeThatFits:CGSizeMake(textView.frame.size.width, CGFLOAT_MAX)].height + CELL_HEIGHT_PADDING;

    if (newTextViewHeight > oldTextViewHeight ||
        (newTextViewHeight != oldTextViewHeight && oldTextViewHeight != TEXTVIEW_CELL_TEXTVIEW_HEIGHT)) {

        [self reloadRowHeights];

    }
}

- (void)reloadRowHeights {
    // This will cause an animated update of the height of the UITableViewCell
    [self.tableView beginUpdates];
    [self.tableView endUpdates];
}

同样重要的是要注意我使用的是自定义节标题,这使我的问题类似于此处提到的问题: UITableView Custom Section Header, duplicate issue

但是我无法使用上述问题的解决方案,因为我无法在用户输入文本的中间为tableView重新加载数据。

2 个答案:

答案 0 :(得分:0)

尝试实施

tableView(_ tableView: UITableView, estimatedHeightForHeaderInSection section: Int)

委托方法,如果你没有

答案 1 :(得分:0)

参加聚会的时间已经很晚了,但是我找不到一个有效的解决方案,然后我想出了一个,所以我想我会分享。

我将UITableViewAutomaticDimension用于单元格高度和截面标题高度。我的标题视图类只是一个UIView子类,根据需要包含一些子视图。在我的tableView(:viewForHeaderInSection:)类中,我只是根据需要初始化了一个新的标题视图,我遇到了这个重复的标题问题。甚至没有reloadData帮助。

似乎已经为我修复的是为标题实现基本的“单元重用”。像这样:

将标题视图存储在视图控制器中的某个字典中。

class ViewController: UIViewController {
   var sectionHeaders: [Int: UIView] = [:]
   // etc...
}

然后,根据请求,返回现有的部分标题视图(如果可用),或者创建并存储新的部分。

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
   if let sectionHeader = self.sectionHeaders[section] {
      return sectionHeader
   } else {
      let sectionHeader = YourSectionHeader()
      // Setup as needed...
      self.sectionHeaders[section] = sectionHeader
      return sectionHeader
   }
}