2009-05-20 183 views
14

的时候我不知道为什么会这样难。我的页面顶部有一个UISearchBar。当用户键入该UISearchBar时,它将自动过滤搜索栏下方的UITableView中的结果。由于我在按键时搜索,所以不需要搜索按钮。隐藏键盘失去焦点关闭的UISearchBar

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

我有一个很难让键盘消失。

我知道我需要做的:

[searchBar resignFirstResponder]; 

获得消失键盘,但我无法找到我需要的东西委托执行此上。我想在用户触摸表视图时立即执行此操作。

任何想法?

+0

检查:http://stackoverflow.com/questions/7482266/resign-keyboard-when-losing-focus- on-uisearchbar – alternatiph 2014-11-08 20:59:27

回答

1

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

+1

这将需要按下搜索按钮来移除键盘 - 我觉得这一步应该是不必要的,可能会让用户感到挫败。不过谢谢。 – rein 2009-05-20 14:54:24

9

试试这个:

- (void)viewWillDisappear:(BOOL)animated { 

    [super viewWillDisappear:animated]; 

    [searchBar resignFirstResponder]; 

} 

它为我

2

我认为这样做最简单的(和最好)的方法是继承你的全球视野和使用则hitTest:withEvent方法来听任何触摸。在键盘上触摸没有注册,所以hitTest:withEvent只有当你触摸/滚动/刷卡/捏...在其他地方,然后调用[self endEditing:YES]时才会调用。

这比使用的touchesBegan,因为如果你点击一个按钮在视图顶部的touchesBegan不叫更好。它也比使用昏暗的屏幕更好,因为在一个复杂而动态的用户界面中,你无法将昏暗的屏幕放在每个地方。此外,它比调用[searchBar resignFirstResponder]更好,因为你可能在屏幕上有很多文本字段,所以这对所有的人都适用。

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]; 
} 
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失去焦点,并且键盘将隐藏。

1

一种可能性是UISearchBar属于一个控制器,它显示在UIModalPresentationFormSheet中。 我有同样的问题,并发现这与UIViewController的方法“disablesAutomaticKeyboardDismissal”有关。

Apple documentation状态如下:

重写此方法在子类中,从想要的输入的控制改变 当允许或禁止电流输入视图(通常是系统的键盘)的解雇 查看一个没有。在 正常情况下,当用户点击需要输入视图的控件时,系统会自动显示该视图。随后不想要输入视图的 控件中的点击会导致 当前输入视图被取消,但可能不会在所有情况下取消。您可以在这些未决情况下覆盖此方法以允许输入 视图被解散或使用此方法防止视图在其他情况下被解散。

此方法的默认实现返回YES时,视图控制器的模态 呈现样式设置为 UIModalPresentationFormSheet和其他演示 风格返回NO。因此,系统通常不允许键盘被模态形式解除。

就我而言,我所显示的导航条中的搜索栏,所以我不得不创建UINavigationViewController的子类,覆盖方法如下:

- (BOOL)disablesAutomaticKeyboardDismissal { 
    return NO; 
} 

之后resignFirstResponder将最终使键盘消失。

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) 
}