UITableViewCell 未在 "Live" 搜索中自动调整大小

UITableViewCell Not Autoresizing in "Live" Search

一点背景知识

我正在为我的应用程序中的某些公告制作搜索功能。我将初始公告加载到 UITableView 中,并带有要显示的自定义单元格。为了在 AnnouncementTableViewController class 的 viewDidLoad() 方法中实现动态单元格大小,我使用了自动调整技术:

tableView.estimatedRowHeight = tableView.rowHeight
tableView.rowHeight = UITableViewAutomaticDimension

这非常适合显示具有不同高度的单元格。刷新单元格数据时调用 tableView.reloadData() 效果很好。

我有一个不同的 UITableView,它最初显示空白表格视图,UISearchBar 作为 header。我实现了 UISearchBarDelegate 方法 searchBar(_:textDidChange:),执行我的搜索过滤逻辑并将过滤后的公告附加到 filteredAnnouncements 数组。

我在 didSet 中为 filteredAnnouncements 调用了 tableView.reloadData() 方法。

问题

当我在搜索栏中键入时,单元格不会自动调整自身大小,实际上它们是默认高度。我有一个标题和每个公告的 body,所以 body 被截断了。

我试过的

UITableAutomaticDimension 技巧似乎不适用于实时搜索(每次按键后更新)。我试过在 filteredAnnouncements 数组的 didSet 观察者中调用 tableView.setNeedsDisplay()tableView.setNeedsUpdatedConstraintstableView.setNeedsLayout()

我试图覆盖自定义单元格 class 中的 didMoveToSubview() 方法,以根据旧的 Whosebug 问题调用上面命名的那些不同方法,但都没有成功。

编辑:在下面回答了自己的问题

在 table 上调用 beginUpdatesendUpdates 将强制它重新计算所有行的高度。

我认为如果您实现 UITableView 的行 insertion/deletion 方法而不是使用 reloadData,您会发现整个体验更容易(并且让您的用户更满意!) .

我正在覆盖 tableView(_:heightForRowAtIndexPath:) 并返回 tableView.estimatedRowHeight。我将方法更改为:

override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return tableView.estimatedRowHeight
}