UISearchController searchBar 在第一次点击时消失

UISearchController searchBar disappears on first click

我在 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];

尝试检查 navigationBar.translucent 属性 - 当 UISearchController 出现 searchBar 时应该是 YES,否则将是 UI 错误。

@SiavA更新

更好的解决方案是使用 extendedLayoutIncludesOpaqueBars 属性 的 UIViewController。如果您使用不透明的导航栏,只需将其设置在控制器的 true 中,控制器将显示 UISearchController(不适用于 navigationController)。

例如

- (void)viewDidLoad {
    [super viewDidLoad];

    self.extendedLayoutIncludesOpaqueBars = !self.navigationController.navigationBar.translucent;
}

UISearchController 隐藏导航栏时,这发生在我身上。设置此 属性 修复它:

UISearchController.hidesNavigationBarDuringPresentation = NO;

将 SearchController 放在 UIScrollView 中,它将正常工作。如果您在 header 部分或作为单独的视图使用它

如果你 运行 在 iOS11 中遇到这个问题(特别是如果它在 iOS11 之前有效),我必须更改我的 UISearchController 以附加到 navigationItem 而不是表格视图。

在我的 searchController 上设置参数后,我曾经这样做:

tableView.tableHeaderView = searchController.searchBar

现在我有了这个:

navigationItem.searchController = searchController

"translucent" 修复将允许控制器出现,但是当我尝试放松到特定的 segue 时,我会遇到崩溃。将 searchController 附加到 navigationItem 修复了显示和崩溃。

将导航栏的 isHidden 设置为 false 可阻止搜索栏对我消失。

      self.navigationController?.navigationBar.isHidden = false

大家好,这个问题有一个非常简单的解决方案。 -- 这将解决视图集合和包含多个视图控制器的父视图的主要问题。

  • 如果您刚刚从代码中删除以下代码,则不需要以下任何代码

// 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

}