如何在navigationItem的searchBar具有焦点时关闭ViewController

时间:2017-10-05 12:04:14

标签: ios uiviewcontroller uisearchcontroller

我更新了我的应用以处理导航栏下搜索栏的新iOS 11搜索行为:

- (void)viewDidLoad
{
    [super viewDidLoad];

    UISearchController *searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
    self.navigationItem.searchController = searchController;

    // Those are optional, but that's what I want my UI to look like
    searchController.hidesNavigationBarDuringPresentation = NO;
    searchController.obscuresBackgroundDuringPresentation = NO;
    self.navigationItem.hidesSearchBarWhenScrolling = NO;
}

我的视图上还有一个按钮,点击时会关闭当前的视图控制器:

- (IBAction)dismiss:(id)sender
{
    [self dismissViewControllerAnimated:YES completion:nil];
}

问题是:如果searchController的searchBar在用户点击按钮时具有焦点(即第一响应者),则视图控制器不会被解除。

  • 在第一次点击按钮时,searchBar失去焦点并且键盘隐藏(就像调用[searchBar resignFirstResponder]一样);
  • 在第二次点击时,视图控制器最终被解雇。

enter image description here

如何首次点按按钮立即关闭视图控制器(删除searchBar的焦点作为副作用)?

5 个答案:

答案 0 :(得分:1)

立即解除视图控制器的解决方案是使用UISearchController isActive property

- (IBAction)dismiss:(id)sender
{
    self.navigationItem.searchController.active = NO;
    [self dismissViewControllerAnimated:YES completion:nil];
}

答案 1 :(得分:1)

就我而言,解决方法是:

UIView.setAnimationsEnabled(false)
searchController.isActive = false
UIView.setAnimationsEnabled(true)

然后您可以通过委托或直接关闭viewController。

答案 2 :(得分:1)

在我的场景中,我有一个 UITableViewController ,其中带有一个搜索栏作为覆盖。搜索结果位于单独的 UITableViewController 中。现在,我想在显示搜索结果时关闭叠加层。 @Guillaume Algis,您的解决方案也对我来说效果很好。

Swift 4中的语法:

    self.navigationItem.searchController?.isActive = false
    self.dismiss(animated: true) {}

答案 3 :(得分:0)

Swift 4.2

self.searchController.dismiss(animated: false, completion: nil)
self.dismiss(animated: true, completion: {
   ///
})

答案 4 :(得分:0)

以上所有方法都会导致updateSearchResults用空字符串调用。
根据您的实现,这可能导致重新加载表格视图,这可能会损害用户体验。

以下为我解决此问题:

self.presentingViewController?.dismiss(animated: true, completion: nil)