导航栏SearchController返回后SearchBar隐藏问题求助
解决方案
针对导航栏集成UISearchController后,push新页面返回时SearchBar被隐藏的问题,这里提供两种不丢失滚动隐藏功能的修复方案:
方案一:临时切换滚动隐藏状态
在原控制器的viewWillAppear方法中,临时关闭滚动隐藏属性确保SearchBar显示,随后再开启该属性以保留滚动隐藏的功能:
Swift 代码
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) navigationItem.hidesSearchBarWhenScrolling = false DispatchQueue.main.async { self.navigationItem.hidesSearchBarWhenScrolling = true } }
Objective-C 代码
- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; self.navigationItem.hidesSearchBarWhenScrolling = NO; dispatch_async(dispatch_get_main_queue(), ^{ self.navigationItem.hidesSearchBarWhenScrolling = YES; }); }
方案二:滚动tableView到顶部
如果返回时tableView处于滚动状态,强制将其滚动到顶部,让SearchBar自动显示:
Swift 代码
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) if tableView.contentOffset.y > 0 { tableView.setContentOffset(.zero, animated: animated) } }
Objective-C 代码
- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; if (self.tableView.contentOffset.y > 0) { [self.tableView setContentOffset:CGPointZero animated:animated]; } }
问题原因
当hidesSearchBarWhenScrolling设为true时,系统会根据tableView的滚动偏移自动隐藏/显示SearchBar。push新控制器时,原控制器的tableView滚动状态会被保留,返回时若之前tableView处于滚动偏移大于0的状态,SearchBar会保持隐藏。上述两种方案均能在返回时强制恢复SearchBar的显示,同时不破坏滚动隐藏的原有特性。
内容的提问来源于stack exchange,提问作者Anton
相关产品推荐
相关产品推荐

