通过becomeFirstResponder将焦点分配给UISearchController的UISearchBar时,键盘不会出现

chr*_*s P 30 keyboard objective-c uisearchbar ios uisearchcontroller

我花了很多时间在网上搜索并与其他开发者讨论这个问题无济于事.确切的问题在这篇SO帖子中有所描述(专注于UISearchBar,但键盘没有出现),虽然已经有很多年了.

我最近在IB中使用了已弃用的UISearchDisplayController和UISearchBar,并通过iOS8的代码切换到UISearchController.

然而,我遇到的问题是焦点被正确分配(你可以看出因为取消按钮在视图加载后动画到搜索栏的右侧),但是键盘没有显示出来.

这是我的代码.

.H

@property (nonatomic, strong) UISearchController *searchController;
Run Code Online (Sandbox Code Playgroud)

.M

- (void)viewDidLoad {
    [super viewDidLoad];
    ...
    [self initializeSearchController];
    ....
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self.searchController setActive:YES];
    [self.searchController.searchBar becomeFirstResponder];
}

- (void)initializeSearchController {
    self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
    self.searchController.searchResultsUpdater = self;
    self.searchController.dimsBackgroundDuringPresentation = NO;
    self.searchController.delegate = self;
    self.searchController.searchBar.delegate = self;
    [self.searchController.searchBar sizeToFit];

    [self.tableView setTableHeaderView:self.searchController.searchBar];
    self.definesPresentationContext = YES;
}
Run Code Online (Sandbox Code Playgroud)

到目前为止我尝试过的东西.

  • 我已经尝试在0.2秒延迟时调用becomeFirstResponder,正如另一篇SO帖子中所建议的那样.

  • 我在viewDidAppear中设置了一个断点,并验证self.searchController和self.searchController.searchBar都是有效对象,都不是.

  • 我已经尝试遵循UISearchControllerDelegate并使用以下代码片段

这里:

- (void)didPresentSearchController:(UISearchController *)searchController {
    //no matter what code I put in here to becomeFirstResponder, it doesn't
    //matter because this is never called, despite setting the     
    //self.searchController.delegate = self AND 
    //self.searchController.searchBar.delegate = self.
}
Run Code Online (Sandbox Code Playgroud)
  • 我在故事板中从零开始创建了一个新的视图,并且相反于那个视图,以确保我的视图中没有旧的searchBar残余.这也不起作用.

  • 我只是在真实设备(iPhone 6)上进行了测试,并不是没有显示键盘的模拟器问题.

我没有想法,我已经看到了与网络相关的每个问题和答案.什么都行不通.

为了再次澄清发生了什么,searchBar正确地成为第一个响应者,它右侧的取消按钮在屏幕上显示动画,证明这一点,但键盘没有出现,光标不会在searchBar中闪烁.

Seg*_*gev 20

你的代码看起来不错.你所描述的不是正常行为.您可以做的第一件事就是创建一个仅具有UISearchController功能的新项目,并了解它的运作方式.您可以使用它编辑您的问题,以便我们有更好的视图.

关于如何在UISearchController这里实现的一个很好的例子:Sample-UISearchController

添加:

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self.searchController.searchBar becomeFirstResponder];
}
Run Code Online (Sandbox Code Playgroud)

MasterViewController_TableResults.m得到所需要的结果和键盘弹出的推出在iPad和iPhone与iOS 8.3.

您可以查看该项目,看看您的做法有何不同,

编辑:

显然,如果在键盘不显示[self.searchController setActive:YES]之前调用becomeFirstResponder.我想知道这是不是一个错误.


emn*_*mun 19

有同样烦人的问题.你会认为通过将SearchController设置为活动状态,它们都会显示搜索控制器和键盘.不幸的是,它只是第一部分.

我的解决方案

  • 在viewDidAppear中使搜索控制器处于活动状态:

    override func viewDidAppear(animated: Bool) {
      super.viewDidAppear(animated)
      resultSearchController.active = true 
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 一旦它处于活动状态,在didPresentSearchController中作为第一响应者

    func didPresentSearchController(searchController: UISearchController) {
      searchController.searchBar.becomeFirstResponder() 
    }
    
    Run Code Online (Sandbox Code Playgroud)

  • @Valentin,这只适用于我将搜索栏作为主线程上的第一个响应者:`dispatch_async(dispatch_get_main_queue(),{searchController.searchBar.becomeFirstResponder()}) (9认同)
  • 当搜索栏在导航栏中时,有没有人知道为什么这在iOS9上不起作用? (7认同)
  • 不适合我.调用didPresentSearchController,但不显示键盘. (4认同)

小智 12

Swift 3.0(iOS 10)工作解决方案:

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        searchController.isActive = true
        DispatchQueue.main.async { [unowned self] in
            self.searchController.searchBar.becomeFirstResponder()
        }
    }
Run Code Online (Sandbox Code Playgroud)


jsz*_*ski 7

在iOS 9上,我发现它足以延迟becomeFirstResponder()到下一个运行循环:

func focusSearchField() {
    searchController?.active = true

    // skipping to the next run loop is required, otherwise the keyboard does not appear
    dispatch_async(dispatch_get_main_queue(), { [weak self] in
        self?.searchController?.searchBar.becomeFirstResponder()
    })
}
Run Code Online (Sandbox Code Playgroud)