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
}
我在 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
}