UITableViewCell不在“实时”搜索中自动调整

时间:2015-07-17 04:12:16

标签: ios swift uitableview autolayout uisearchbar

背景的一点点

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

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

这对于显示各种高度的细胞非常有效。刷新单元格数据时调用tableView.reloadData()效果很好。

我有一个不同的UITableView,它最初会显示一个空白的tableview和一个UISearchBar作为标题。我实施了UISearchBarDelegate方法searchBar(_:textDidChange:),执行搜索过滤器逻辑并将过滤后的公告附加到filteredAnnouncements数组。

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

问题

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

UITableViewCells cut off the body of the announcement

我尝试过什么

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

我试图覆盖自定义单元格类中的didMoveToSubview()方法,根据旧的stackoverflow问题调用上面提到的那些不同方法,但都没有运气。

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

2 个答案:

答案 0 :(得分:1)

在表格上调用beginUpdatesendUpdates会强制重新计算所有行的高度。

如果您实现UITableView的行插入/删除方法而不是使用reloadData,我认为您会发现整个体验更容易(并且对您的用户更加满意!) / p>

答案 1 :(得分:1)

我覆盖tableView(_:heightForRowAtIndexPath:)并返回tableView.estimatedRowHeight。我把方法改为:

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