在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;
另一个有趣的行为是清除按钮有效(如果在初始化时在搜索栏中设置了某些文本)。
答案 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
。这表明除了使用/不使用插座之外,您的代码可能还有其他差异。