我不确定为什么这么难。我的页面顶部有一个UISearchBar。当用户键入UISearchBar时,它将自动过滤搜索栏下方的UITableView中的结果。因为我在按下按键时搜索,所以不需要搜索按钮。
应用程序的流程是用户在搜索栏中键入搜索(显示键盘),然后在表格视图中滚动结果 - 此时键盘需要消失。
我很难让键盘消失。
我知道我需要这样做:
[searchBar resignFirstResponder];
让键盘消失,但我找不到我需要执行此操作的委托。我想在用户触摸表格视图时立即执行此操作。
有什么想法吗?
答案 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)
可能要迟到才能回答,但这对未来的任何人都有帮助。这段特殊的代码对我有用。附:我不拥有这个解决方案,前段时间在网上发现。
-(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];
}
答案 6 :(得分: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)
}