【问题标题】:Can't edit UISearchController UISearchBar in navigationItem titleView无法在 navigationItem titleView 中编辑 UISearchController UISearchBar
【发布时间】:2016-08-19 08:57:32
【问题描述】:

在navigationItem titleView中设置UISearchController搜索栏时,搜索栏无法编辑。

在我的 viewDidLoad 中,我正在配置 UISearchController。

self.searchViewController = [self.storyboard instantiateViewControllerWithIdentifier:NSStringFromClass([SearchViewController class])];
self.searchViewController.delegate = self;
self.searchController = [[UISearchController alloc] initWithSearchResultsController:self.searchViewController];
self.searchController.delegate = self;
self.searchController.searchResultsUpdater = self;
self.searchController.searchBar.delegate = self;
self.navigationItem.titleView = self.searchController.searchBar;

我无法点击搜索栏。光标没有出现,也没有用户交互。

奇怪的是,如果我在本地初始化 UISearchController 而不将其设置为属性,那么我可以编辑搜索栏,只是没有委托回调。

self.searchViewController = [self.storyboard instantiateViewControllerWithIdentifier:NSStringFromClass([SearchViewController class])];
self.searchViewController.delegate = self;
UISearchController *searchController = [[UISearchController alloc] initWithSearchResultsController:self.searchViewController];
searchController.delegate = self;
searchController.searchResultsUpdater = self;
searchController.searchBar.delegate = self;
self.navigationItem.titleView = searchController.searchBar;

另一个有趣的行为是清除按钮有效(如果在初始化时在搜索栏中设置了一些文本)。

【问题讨论】:

  • 我有同样的问题,建议的答案都不起作用。你找到解决方案了吗?
  • @SilviaHisham 是的,对我有用的是我下面的答案stackoverflow.com/a/36893699/4099344

标签: ios objective-c cocoa-touch uisearchcontroller


【解决方案1】:

在您的第一个代码块中,您使用SearchViewController 标识符进行实例化。在第二个中,您使用的是HBSearchViewController。这表明除了使用/不使用插座之外,您的代码可能还有其他区别。

【讨论】:

  • 对不起,这是我的错误。我在第一个代码块中删除了前缀,在第二个代码块中忘记了。
【解决方案2】:

将搜索栏设置为导航标题视图:

self.navigationItem.titleView = self.searchBarTop;

然后只需将此视图设置为导航栏的左/右按钮

UIBarButtonItem *searchBarItem = [[UIBarButtonItem alloc] initWithCustomView:searchBar];
self.navigationItem.rightBarButtonItem = searchBarItem;

我希望这对你有用!!

【讨论】:

    【解决方案3】:

    我在显示相关视图控制器的视图控制器中设置self.definesPresentationContext = YES;

    这必须在viewWillAppear: 中设置为self.definesPresentationContext = NO;

    现在可以编辑呈现的视图控制器中的搜索栏。

    【讨论】:

    • 设置 self.definesPresentationContext = NO;究竟在哪个 ViewController 中?有 UISearchController 的那个还是之前的那个?
    • @SilviaHisham 你可以看我的回答来澄清stackoverflow.com/a/42148381/976628
    【解决方案4】:

    我刚刚在我的应用中解决了一个非常相似的问题,我想我会分享解决方案,以防现有解决方案无法为您解决问题。

    在我的例子中,我有一个标签栏应用程序,我的自定义控制器在标签中,嵌​​入在导航控制器中。症状一模一样,搜索栏显示在导航栏的标题区,但不是交互的。

    我发现问题在于我使用了 UITabBarController 的自定义子类,并且我覆盖了 viewWillAppear(animated:) 方法,但忘记在实现中调用 super.viewWillAppear(animated:)。另一个症状是,当我切换选项卡时,搜索栏突然变得互动,一切正常,只是初始选项卡上的交互被禁用了。

    我希望这对某人有所帮助。

    【讨论】:

      【解决方案5】:

      我遇到了同样的问题。

      假设你有FirstViewController和SecondViewController,并且在titleView上有一个UISearchBar。

      为了解决这个问题,我将这段代码放到 UIViewController 的展台上。

      override func viewWillAppear(animated: Bool) {
          super.viewWillAppear(animated)
      
          self.definesPresentationContext = true
      
      }
      
      override func viewWillDisappear(animated: Bool) {
          super.viewWillDisappear(animated)
      
          self.definesPresentationContext = false
      
      } 
      

      【讨论】:

      • 谢谢!你的答案是唯一对我有用的答案。
      • 这个!这是唯一有效的答案!谢谢!!!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多