UISearchController搜索栏第一次点击后消失。

6

我在导航控制器中实现了一个Table View的UISearchController。

我的问题是,每当我点击搜索栏时,它都会消失。当我输入一些文本时它可以工作,但它完全为空白。然后我使用以下代码部分地解决了这个问题:

- (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];

1
你好。请展示一下你的uisearchcontroller初始化代码。查看此链接并确保你的初始化代码是正确的。https://developer.apple.com/library/ios/samplecode/TableSearch_UISearchController/Introduction/Intro.html - Serge Maslyakov
嗨,我已经更新了代码。在我看来它看起来很好。 - el-flor
2
  1. 请尝试检查NavigationBar的半透明属性 - 当SearchController呈现searchBar时,它应该是“YES”,否则会出现UI错误。
  2. 如果使用了默认的UISearchController呈现方式,则不应手动管理将searchBar添加到子视图中。
- Serge Maslyakov
你的第一个选项对我有效!请将其作为答案并我会接受它。第一个选项与第二个结合使用!我不再添加子视图,只需设置透明属性即可! - el-flor
6个回答

24

UISearchController隐藏导航栏时,我遇到了这个问题。将该属性设置为以下内容即可解决:

UISearchController.hidesNavigationBarDuringPresentation = NO;


谢谢啊伙计,救了我的一天!干杯! - Manann Sseth
这是正确的答案。它甚至适用于iOS 11。 - jlstr

16

尝试检查navigationBar.translucent属性,当UISearchController呈现searchBar时,它应该为YES,否则会出现UI错误。

来自@SiavA的更新

更好的解决方案是使用UIViewControllerextendedLayoutIncludesOpaqueBars属性。如果您正在使用不透明的导航栏,请将其设置为true以供将显示UISearchController的控制器使用(而不是navigationController)。

例如:

- (void)viewDidLoad {
    [super viewDidLoad];

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

哦,我的天啊,非常感谢你! - Happiehappie
1
这不是UI的bug。如果navigationBar.transcluent为NO,则您的导航栏是不透明的,您必须相应地通知UI,对应于iOS 7使用视图控制器(还要查看edgesForExtendedLayout): https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TransitionGuide/AppearanceCustomization.html 因此,要修复您的“错误”,您必须将extendedLayoutIncludesOpaqueBars设置为YES,以针对您的导航控制器。 - SiavA
@SiavA。你好。非常感谢您的评论。我会将其添加到回复中。 - Serge Maslyakov

0
将导航栏的 isHidden 属性设置为 false,可以防止搜索栏消失。
      self.navigationController?.navigationBar.isHidden = false

0
如果您在iOS11中遇到了这个问题(尤其是在之前的iOS版本中可以正常工作),我不得不将我的UISearchController更改为附加到navigationItem而不是tableView。
在设置了搜索控制器的参数之后,我曾经这样做:
tableView.tableHeaderView = searchController.searchBar

现在我有这个:
navigationItem.searchController = searchController

“半透明”修复方法可以让控制器出现,但是当我尝试返回到特定的segue时,会导致崩溃。将searchController附加到navigationItem上既解决了显示问题,也解决了崩溃问题。

0
将SearchController放置在UIScrollView内,它将正常工作。如果您将其用于节标题或作为单独的视图,则需要这样做。

0

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

  • 如果您只是删除了以下代码,则不需要任何下面的代码

// searchController.definesPresentationContext = true

// self.definesPresentationContext = true

// self.extendedLayoutIncludesOpaqueBars = !(self.navigationController?.navigationBar.isTranslucent)!

我只添加了以下代码,请确保您始终将searchController设置为nil 如果您在视图控制器之间切换,可能会出现一些冲突,可以通过在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

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接