如何在 UINavigationBar 中隐藏 UISearchController

How to hide UISearchController in UINavigationBar

我有一个导航栏,当屏幕首次显示时,导航栏上没有搜索栏。我触发并在导航栏中显示搜索栏,但我想知道如何隐藏搜索栏并再次显示导航栏标题。

我创建的搜索栏如下:

_searchController = [[UISearchController alloc] initWithSearchResultsController:nil];

self.searchController.searchResultsUpdater = self;
self.searchController.searchBar.placeholder = nil;
[self.searchController.searchBar sizeToFit];
//self.tableView.tableHeaderView = self.searchController.searchBar;
self.sharedNavigationItem.titleView = _searchController.searchBar;

self.searchController.delegate = self;
self.searchController.dimsBackgroundDuringPresentation = NO; // default is YES
self.searchController.searchBar.delegate = self; // so we can monitor text changes + others
self.definesPresentationContext = YES;
_searchController.hidesNavigationBarDuringPresentation = NO;

我只想在这里隐藏搜索栏并显示带有标题的普通导航栏:

您可以尝试在 属性 下方添加。

hidesNavigationBarDuringPresentation。

供参考:

另一个参考:

- (void)viewDidLayoutSubviews {
    [self.navigationController setNavigationBarHidden:NO animated:NO];
}

UISearchDisplayController hiding navigation bar

注:未测试

如果你想隐藏整个导航栏,如果你想使用自己的导航栏,你可以先隐藏导航控制器的导航栏。

[self.navigationController setNavigationBarHidden:YES];
//OR
[self.navigationController setNavigationBarHidden:YES animated:NO];

或者如果您已经为导航栏使用了自定义标题视图,您可以这样做

self.navigationItem.titleView.hidden = YES;

或者如果你想隐藏后退栏按钮项目,你可以这样做

self.navigationItem.hidesBackButton = TRUE;

或者如果您只想隐藏标题,您可以这样做

self.navigationItem.title = @"";

self.navigationController.navigationItem.titleView = nil ;

我遇到了同样的问题。以前的答案建议废弃整个 NavigationBar,但这不是研究的行为。解决方案是在按下搜索按钮时添加 searchBar...

@IBAction func didPressAddButton(_ sender: Any) {
    if #available(iOS 11.0, *) {
        // For iOS 11 and later, place the search bar in the navigation bar.
        navigationItem.searchController = tagSearchController 
        navigationItem.hidesSearchBarWhenScrolling = true
    } else {
        // For iOS 10 and earlier, place the search controller's search bar in the table view's header.
        tableView.tableHeaderView = tagSearchController.searchBar
    }

    tagSearchController.isActive = true 
}

...并在调用 didDismissSearchController 时将其删除(UISearchControllerDelegate 方法)。

func didDismissSearchController(_ searchController: UISearchController) {
    if #available(iOS 11.0, *) {
        // For iOS 11 and later, place the search bar in the navigation bar.
        navigationItem.searchController = nil

    } else {
        // For iOS 10 and earlier, place the search controller's search bar in the table view's header.
        tableView.tableHeaderView = nil
    }
}

注意:我的 searchController 是在 viewDidLoad()

中创建和配置的