Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何用UISearchBar替换导航栏?_Ios_Uinavigationbar_Uisearchbar_Uisearchcontroller - Fatal编程技术网

Ios 如何用UISearchBar替换导航栏?

Ios 如何用UISearchBar替换导航栏?,ios,uinavigationbar,uisearchbar,uisearchcontroller,Ios,Uinavigationbar,Uisearchbar,Uisearchcontroller,我想用搜索栏取代导航栏,一旦显示和返回 或 如果导航栏总是覆盖我的主视图控制器的内容,我会很好 我设置搜索控制器如下: _searchController = [[UISearchController alloc] initWithSearchResultsController:[[MySearchViewController alloc] init]]; _searchController.delegate = self; _searchController.obscuresBackgrou

我想用搜索栏取代导航栏,一旦显示和返回

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


我设置搜索控制器如下:

_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 = [[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 = [[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动画:NO]显示搜索控制器时隐藏导航栏
  • 控制搜索栏高度约束并根据可见性进行更改的步骤
  • 要将搜索控制器设置为
    navigationItem.titleView
    ->,这不是我想要的
  • 要根据visivility隐藏搜索控制器->导航栏保持相同高度,仅隐藏搜索控制器
  • 使用,但这似乎是一个不同的设置,我需要什么
  • 滚动时查看了self.navigationItem.HideseArchBar,但这不适用,因为我不使用表视图控制器

    • 我可以选择

      我想用搜索栏取代导航栏,一旦显示和返回

      工作

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

      如果有更简单的方法实现同样的目标,我会很感兴趣

      @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;
      }
      
      @接口MyViewController()
      @结束
      @MyViewController的实现
      {
      UIView*_导航项目标题视图;
      NSArray*_LeftBarbuttonims;
      NSArray*_RightBarbuttonims;
      }
      -(无效)viewDidLoad
      {
      _searchController=[[UISearchController alloc]initWithSearchResultsController:[[MySearchViewController alloc]init]];
      // ....
      _navigationItemTitleView=self.navigationItem.titleView;
      _LeftBarButtonims=self.navigationItem.LeftBarButtonims;
      _RightBarButtonims=self.navigationItem.RightBarButtonims;
      }
      -(无效)搜索按钮已标记:(id)发件人
      {
      //在导航项中显示搜索栏
      self.navigationItem.LeftBarButtonims=nil;
      self.navigationItem.RightBarButtonims=nil;
      self.navigationItem.titleView=\u searchController.searchBar;
      _searchController.active=TRUE;
      }
      -(无效)willDismissSearchController:(UISearchController*)searchController
      {
      //隐藏搜索栏并恢复导航项的以前状态
      self.navigationItem.leftBarButtonItems=_leftBarButtonItems;
      self.navigationItem.rightBarButtonItems=_rightBarButtonItems;
      self.navigationItem.titleView=\u navigationItemTitleView;
      }