UITableView更新行高后,重复出现分区标题

3
在我的iOS应用中,我有一个UITextView在tableview单元格中。
当用户输入的文本框所需的框架超过当前单元格高度时,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自定义节标题,重复问题 然而,我不能使用上述问题的解决方法,因为我无法在用户输入文本时重新加载tableView。

@ozgurv:我已经添加了一些相关的代码到问题中,以便更好地理解。 - Vibhor Goyal
当您在beginUpdates/endUpdates调用之间调用了[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone:]会发生什么? - Ozgur Vatansever
你找到这个 bug 的解决方案了吗? - Manoj
@joakim,具体情况是tableview调用viewForHeader,但它没有获取到可重用的HeaderView,而是分配了一个新的HeaderView,并将该HeaderView添加到tableview中,导致显示多个HeaderView。我已经为解决这个问题苦苦挣扎了4-5天。 - Manoj
@adauguet 很遗憾我没有找到任何答案,但我缓存了头部信息(这不是一个推荐的方式),而不是创建一个新的。 - Manoj
显示剩余6条评论
2个回答

0

虽然有点晚了,但我在SO上找不到可行的解决方案,后来我想出了一个,所以我想分享一下。

我使用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
   }
}

0
尝试实现

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

委托方法,如果您还没有这样做。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接