我有一个表视图控制器与一个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() } }