【问题标题】:How to replace the navigation bar with an UISearchBar?如何用 UISearchBar 替换导航栏?
【发布时间】:2020-02-28 12:29:16
【问题描述】:

我想在显示后用搜索栏替换导航栏。

如果导航栏总是超过我的主视图控制器的内容,我会很好。


我像这样设置搜索控制器:

_searchController = [[UISearchController alloc] initWithSearchResultsController:[[MySearchViewController alloc] init]];
_searchController.delegate = self;
_searchController.obscuresBackgroundDuringPresentation = TRUE;
_searchController.hidesNavigationBarDuringPresentation = TRUE;
_searchController.searchBar.placeholder = @"Search...";
_searchController.searchBar.delegate = self;

我像这样显示搜索控制器:

- (void)searchButtonTapped:(id)sender
{
  self.navigationItem.searchController = _searchController;
  [self.navigationController.view setNeedsLayout];
  [self.navigationController.view layoutIfNeeded];
  [self.navigationItem.searchController.searchBar becomeFirstResponder];
}

我像这样隐藏搜索控制器:

- (void)willDismissSearchController:(UISearchController*)searchController
{
  self.navigationItem.searchController = nil;
  [self.navigationController.view setNeedsLayout];
}

我知道searchController.hidesNavigationBarDuringPresentation 的属性与我想要的很接近,但正是如此。因为导航栏只有在我进入搜索栏后才会隐藏,但我希望它在我呈现搜索栏时已经隐藏。

只要我按下导航栏中的搜索图标按钮,它就会被搜索控制器替换,并且只有搜索栏在顶部可见。有谁知道如何做到这一点?


我已经试过了:

  • 当我用[self.navigationController setNavigationBarHidden:YES animated:NO]; 显示搜索控制器时隐藏导航栏
  • 控制搜索栏高度限制并根据可见性进行更改
  • 将搜索控制器设置为navigationItem.titleView -> 这不是我想要的
  • 根据可见性隐藏搜索控制器 -> 导航栏保持相同高度,仅隐藏搜索控制器
  • 使用self.definesPresentationContext,但这似乎与我需要的设置不同
  • 查看了self.navigationItem.hidesSearchBarWhenScrolling,但这并不适用,因为我不使用表格视图控制器

【问题讨论】:

    标签: ios uinavigationbar uisearchbar uisearchcontroller


    【解决方案1】:

    我可以做我的第一个选择

    我想在显示后用搜索栏替换导航栏。

    工作。

    当 UISearchBar 显示时,我使用了显示和隐藏导航项的左右 bat 按钮项的方法。

    如果有更简单的方法来达到同样的效果,我会感兴趣吗?

    @interface MyViewController() <UISearchControllerDelegate, SearchDelegate>
    @end
    
    @implementation MyViewController
    {
      UIView*                    _navigationItemTitleView;
      NSArray<UIBarButtonItem*>* _leftBarButtonItems;
      NSArray<UIBarButtonItem*>* _rightBarButtonItems;
    }
    
    - (void)viewDidLoad
    {
      _searchController        = [[UISearchController alloc] initWithSearchResultsController:[[MySearchViewController alloc] init]];
      // ....
      _navigationItemTitleView = self.navigationItem.titleView;
      _leftBarButtonItems      = self.navigationItem.leftBarButtonItems;
      _rightBarButtonItems     = self.navigationItem.rightBarButtonItems;
    }
    
    - (void)searchButtonTapped:(id)sender
    {
      // show the search bar in the navigation item
      self.navigationItem.leftBarButtonItems  = nil;
      self.navigationItem.rightBarButtonItems = nil;
      self.navigationItem.titleView = _searchController.searchBar;
      _searchController.active = TRUE;
    }
    
    - (void)willDismissSearchController:(UISearchController*)searchController
    {
      // hide the search bar and restore previous state of the navigation item
      self.navigationItem.leftBarButtonItems  = _leftBarButtonItems;
      self.navigationItem.rightBarButtonItems = _rightBarButtonItems;
      self.navigationItem.titleView           = _navigationItemTitleView;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      相关资源
      最近更新 更多