UISearchController searchBar在第一次点击时消失

时间:2015-10-26 08:37:06

标签: ios tableview uisearchbar uisearchcontroller

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

6 个答案:

答案 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

}