关闭UISearchBar失去焦点时隐藏键盘

时间:2009-05-20 14:31:04

标签: iphone cocoa-touch

我不确定为什么这么难。我的页面顶部有一个UISearchBar。当用户键入UISearchBar时,它将自动过滤搜索栏下方的UITableView中的结果。因为我在按下按键时搜索,所以不需要搜索按钮。

应用程序的流程是用户在搜索栏中键入搜索(显示键盘),然后在表格视图中滚动结果 - 此时键盘需要消失。

我很难让键盘消失。

我知道我需要这样做:

    [searchBar resignFirstResponder];

让键盘消失,但我找不到我需要执行此操作的委托。我想在用户触摸表格视图时立即执行此操作。

有什么想法吗?

7 个答案:

答案 0 :(得分:10)

试试这个:

- (void)viewWillDisappear:(BOOL)animated {

    [super viewWillDisappear:animated];

    [searchBar resignFirstResponder];

}

它对我有用

答案 1 :(得分:2)

我认为最简单(也是最好)的方法是子类化全局视图并使用hitTest:withEvent方法来监听任何触摸。键盘上的触摸没有注册,所以hitTest:withEvent仅在你触摸/滚动/滑动/捏合...其他地方时被调用,然后调用[self endEditing:YES]。

这比使用touchesBegan更好,因为如果单击视图顶部的按钮,则不会调用touchesBegan。它也比使用昏暗的屏幕更好,因为在复杂和动态的用户界面中,你不能把昏暗的屏幕放在每个地方。此外,它比调用[searchBar resignFirstResponder]更好,因为屏幕上可能有许多文本字段,因此这适用于所有这些字段。

答案 2 :(得分:1)

你可能想要这样做,因为Cydia(越狱包装UI)做到了 - 有一个搜索按钮,当你按下搜索按钮时,它会关闭键盘。在您键入预览时,结果仍会被过滤。

答案 3 :(得分:1)

由于结果将在表格视图中,因此请使用UIScrollView的委托(UITableView响应)方法- (void)scrollViewDidScroll:(UIScrollView *)scrollView

您需要让视图控制器响应UITableView的数据源并委托(在.h文件中):

<UITableViewDataSource, UITableViewDelegate>

.m文件中的初始化方法添加:

self.tableView.dataSource = self;
self.tableView.delegate = self;

最后,添加此方法:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    [self.view endEditing:YES];
}

这将使UISearchBar失去焦点,键盘将隐藏。

答案 4 :(得分:1)

一种可能性是UISearchBar属于一个控制器,它显示在UIModalPresentationFormSheet中。 我遇到了同样的问题,发现这与方法有关&#34; disablesAutomaticKeyboardDismissal&#34; UIViewController。

Apple documentation声明如下:

  

在子类中重写此方法以允许或禁止解雇   更改时的当前输入视图(通常是系统键盘)   从想要输入视图的控件到不需要输入视图的控件。下   正常情况下,当用户点击需要的控件时   在输入视图中,系统自动显示该视图。攻击一个   不希望输入视图的控件随后导致   当前输入视图将被解除,但可能并非在所有情况下都被忽略。您可以   在那些未完成的情况下覆盖此方法以允许输入   视图被解雇或使用此方法来阻止视图   在其他情况下被驳回。

     

此方法的默认实现在模态时返回YES   视图控制器的表示样式设置为   UIModalPresentationFormSheet并为其他演示文稿返回NO   样式。因此,系统通常不允许键盘   以模态形式被驳回。

就我而言,我在导航栏中显示了搜索栏,因此我必须创建一个UINavigationViewController的子类,它会覆盖该方法,如下所示:

- (BOOL)disablesAutomaticKeyboardDismissal {
    return NO;
}

之后,resignFirstResponder最终会使键盘消失。

答案 5 :(得分:0)

给定带有searchBar变量的视图,将此方法添加到视图中:

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView?
{
    if searchBar.isFirstResponder && !searchBar.point(inside: point, with: event){
        searchBar.resignFirstResponder()
    }
    return super.hitTest(point, with: event)
}

答案 6 :(得分:0)

可能要迟到才能回答,但这对未来的任何人都有帮助。这段特殊的代码对我有用。附:我不拥有这个解决方案,前段时间在网上发现。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [[event allTouches] anyObject];
if ([self.srchBar isFirstResponder] && [touch view] != self.srchBar)
{
    [self.srchBar resignFirstResponder];
}   
[super touchesBegan:touches withEvent:event];
}