无法在navigationItem titleView中编辑UISearchController UISearchBar

时间:2016-04-25 19:35:20

标签: ios objective-c cocoa-touch uisearchcontroller

在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;

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

5 个答案:

答案 0 :(得分:7)

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

必须将此设置为self.definesPresentationContext = NO;中的viewWillAppear:

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

答案 1 :(得分:5)

我遇到了同样的问题。

想象一下你有FirstViewController和SecondViewController,而booth在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

} 

答案 2 :(得分:1)

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

self.navigationItem.titleView = self.searchBarTop;

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

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

我希望这对你有用!!

答案 3 :(得分:1)

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

在我的情况下,我有一个标签栏应用程序,我的自定义控制器位于选项卡中,嵌入在导航控制器中。症状完全相同,搜索栏显示在导航栏的标题区域,但不是交互式的。

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

我希望这有助于某人。

答案 4 :(得分:0)

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