更新行高后 UITableView 重复节标题

Posted

技术标签:

【中文标题】更新行高后 UITableView 重复节标题【英文标题】:UITableView duplicate section header after updating row heights 【发布时间】:2015-02-05 01:01:46 【问题描述】:

在我的 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 重新加载数据。

【问题讨论】:

向我们展示您的一些代码以帮助我们准确了解您想要实现的目标怎么样?不用担心,我们不会偷任何东西。 @ozgurv:我在问题中添加了一些相关代码,以便提供更好的视角。 在 beginUpdates/endUpdates 调用之间调用 [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone:] 时发生了什么? 当您说“重复的部分标题”时,您到底是什么意思?你在原来的顶部得到了一个新的标题? @joakim:我得到了两个部分标题,一个是它应该在的位置,另一个是在初始位置(在初始位置之后,单元格已经扩展,因此原始标题现在与扩展单元格)。 【参考方案1】:

尝试实现

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

如果你没有委托方法

【讨论】:

【参考方案2】:

聚会有点晚了,但我找不到关于 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
   

【讨论】:

以上是关于更新行高后 UITableView 重复节标题的主要内容,如果未能解决你的问题,请参考以下文章

通用故事板 UITableview 行高

UITableView中的节标题视图重复

当 UITableView 单元格中的 UITextView 大小增加时,节标题重复

UITableView 节标题停止位置

Objective-C UI之UITableView详解

iPhone + UITableView + 行高