我在TableView中实现了一个UISearchController,由导航控制器推送。
首先我的问题是每当我点击SearchBar时,它就会消失。当我输入一些文本时,它可以工作,但它保持完全空白。然后我设法使用此代码半解决问题:
- (void)searchForText:(NSString*)searchText
{
[self.view addSubview:villeSearchController.searchBar];
}
哪个半工作因为现在,当我点击搜索栏时,它会消隐,但是如果我输入一个字符,它会再次显示,然后它就会停留在那里,无论如何。直到我取消搜索,然后再次点击它,在这种情况下它会消隐。 我做了一些测试,并且在第一次点击时调用了这个方法(searchForText),所以这不是原因。
有没有人知道如何解决这个问题,并在第一次点击时显示搜索栏?
编辑:
这是我初始化SearchController的方法:
villeSearchController = [[UISearchController alloc] initWithSearchResultsController:nil];
villeSearchController.searchResultsUpdater = self;
villeSearchController.dimsBackgroundDuringPresentation = NO;
villeSearchController.searchBar.delegate = self;
villeTableView.tableHeaderView = villeSearchController.searchBar;
villeSearchController.searchBar.scopeButtonTitles = @[];
self.definesPresentationContext = YES;
[villeSearchController.searchBar sizeToFit];
答案 0 :(得分:15)
当UISearchController
隐藏导航栏时发生了这种情况。设置此属性修复了它:
UISearchController.hidesNavigationBarDuringPresentation = NO;
答案 1 :(得分:13)
尝试检查navigationBar.translucent
属性 - UISearchController
出现searchBar
时应为YES,否则会出现UI错误。
从@SiavA更新
更好的解决方案是使用extendedLayoutIncludesOpaqueBars
的{{1}}属性。如果您使用不透明导航栏,只需在控制器UIViewController
中设置它,该控制器将显示true
(不适用于UISearchController
)。
E.g。
navigationController
答案 2 :(得分:0)
将SearchController放在UIScrollView中,它可以正常工作。如果您在节标题中使用它或作为单独的视图
答案 3 :(得分:0)
如果您在iOS11中遇到此问题(特别是如果它在iOS11之前工作),我必须将我的UISearchController更改为附加到navigationItem而不是tableView。
在我的searchController上设置参数后,我曾经这样做过:
tableView.tableHeaderView = searchController.searchBar
现在我有了这个:
navigationItem.searchController = searchController
“半透明”修复将允许控制器出现,但是当我尝试放松到特定的segue时,我会崩溃。将searchController附加到navigationItem会修复显示和崩溃。
答案 4 :(得分:0)
设置isHidden导航栏为false会阻止搜索栏为我消失。
self.navigationController?.navigationBar.isHidden = false
答案 5 :(得分:0)
嗨,伙计们,有一个非常简单的解决方案。 -这将解决视图集合和包含多个viewcontrollers的父视图的主要问题。
// searchController.definesPresentationContext = true
// self.definesPresentationContext = true
// self.extendedLayoutIncludesOpaqueBars = !(self.navigationController?.navigationBar.isTranslucent)!
我只添加以下代码,确保您将searchController设置为始终为nil
如果要在viewController之间切换,则可以通过在setupsearchbar()
中将searchController设置为nil来清除一些冲突。
另外,在viewDidDissapear()上禁用searchController,它将解决与活动搜索栏移至下一个屏幕有关的问题。
var searchController = UISearchController(searchResultsController: nil)
func setupSearchBar() {
searchController = UISearchController(searchResultsController: nil)
// adding search controller
searchController.searchResultsUpdater = self
// changing font color when user types
searchController.searchBar.searchTextField.textColor = .black
//allows select results from filtered table
searchController.searchBar.endEditing(true)
searchController.obscuresBackgroundDuringPresentation = false
searchController.hidesNavigationBarDuringPresentation = false
self.tableView.tableHeaderView = searchController.searchBar
}
override func viewDidDisappear(_ animated: Bool) {
searchController.isActive = false
}