我有一个表视图控制器与一个UISearchController设置UISearchBar作为tableView.tableHeaderView.更新搜索结果时,我使用beginUpdates和endUpdates和相关方法更新表视图的数据.
这使搜索栏消失; tableHeaderView设置为与搜索栏大小相同的空的通用UIView.如果我只是使用reloadData而不是整个beginUpdates / endUpdates过程,一切都很好.
表视图控制器嵌入在常规视图控制器中;没有导航控制器.这是整个执行表视图控制器所必需的重现问题:
- (void)viewDidLoad
{
[super viewDidLoad];
self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
self.searchController.searchResultsUpdater = self;
self.searchController.dimsBackgroundDuringPresentation = NO;
self.tableView.tableHeaderView = self.searchController.searchBar;
}
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController
{
[self.tableView beginUpdates];
[self.tableView endUpdates];
}
为什么这会导致搜索栏被空白的视图所替代,如何才能避免?
解决方法
当您首次点击UISearchController的searchBar时,searchBar的动画需要大约0.5秒.但是由委托方法立即调用self.tableView.endUpdates(),动画被中断.
searchBar卡在动画的中间,你看不到它的UI:
searchBar卡在动画的中间,你看不到它的UI:
一个解决方法是检查searchBar是否在动画中,并在其进入时延迟self.tableView.endUpdates().
func updateSearchResultsForSearchController(searchController: UISearchController){
self.tableView.beginUpdates()
//Do some updates
if !searchController.searchBar.showsCancelButton{
self.tableView.performSelector(#selector(UITableView.endUpdates),withObject: nil,afterDelay: 1)
}else{
self.tableView.endUpdates()
}
}