有谁知道如何取消(辞职第一响应者)从一个UISearchBar当你点击下方的搜索文本框和键盘上方? 任何人都可以帮助发布一些代码来处理呢?
谢谢
有谁知道如何取消(辞职第一响应者)从一个UISearchBar当你点击下方的搜索文本框和键盘上方? 任何人都可以帮助发布一些代码来处理呢?
谢谢
我从没有其它的想法iphonedevbook ,示例代码项目04,是用一个大的透明按钮位于这什么也不做的所有其他控件的后面,但如果窃听辞职所有的第一反应。 也就是说,如果用户点击任何地方还没有一个更重要的控制 - 这是直观的行为 - 搜索栏和键盘消失。
添加在父视图敲击手势(所述的UISearchBar的)
[self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:searchBar action:@selector(resignFirstResponder)]];
我做到了这一点通过使用UITapGestureRecognizer:
UIGestureRecognizer* cancelGesture;
- (void) backgroundTouched:(id)sender {
[self.view endEditing:YES];
}
#pragma mark - UISearchBarDelegate
-(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar {
cancelGesture = [UITapGestureRecognizer new];
[cancelGesture addTarget:self action:@selector(backgroundTouched:)];
[self.view addGestureRecognizer:cancelGesture];
}
-(void)searchBarTextDidEndEditing:(UISearchBar *)searchBar {
if (cancelGesture) {
[self.view removeGestureRecognizer:cancelGesture];
[cancelGesture release];
cancelGesture = nil;
}
}
该代码是一个光秃秃的,但你可以看到的意图。 当搜索栏开始编辑,您可以将点触手势识别器视图控制器的视图,当它停止编辑删除它。
有几个注意事项,你可以解决:这样做将会使它所以如果你点击任何东西,除了键盘或搜索栏的文本字段,识别陷阱的点击 - 如果你使用clear,撤销,范围或结果按钮就不会正确响应。
在我的特殊情况下,我有被覆盖的视图的暴露面积,所以我附手势识别它,而不是视图控制器主视图一个UITableView,分离到的手势会回应的区域。
最后我用Hauke的和博·斯科特的方法的混合体。 有我跑进使用他们的解决方案的两个问题:
1)如果有任何东西在屏幕上,点击它不会导致resignFirstResponder被调用。 例如,如果用户点击一个按钮,而不是周围的按钮的空间,该按钮会吃的事件。 然而,博·斯科特的解决方案解决了这个问题。
2)攻丝搜索栏本身会导致resignFirstResponder获取调用。 显然,你不想把键盘当你点击的UISearchBar消失。 下面描述的微小变化解决此。
我结束了设立我的观点如下。 父视图有两个孩子 - 的的UISearchBar和保持我的UI元素的其余子视图。 该子视图占据了下面的UISearchBar整个屏幕。 然后我用博·斯科特的确切的代码添加和删除手势识别,而不是增加它self.view我把它添加到子视图:
IBOutlet UIView *gestureRecognizer;
...
-(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar {
cancelGesture = [UITapGestureRecognizer new];
[cancelGesture addTarget:self action:@selector(backgroundTouch:)];
[gestureRecognizer addGestureRecognizer:cancelGesture];
}
-(void)searchBarTextDidEndEditing:(UISearchBar *)searchBar {
if (cancelGesture) {
[gestureRecognizer removeGestureRecognizer:cancelGesture];
[cancelGesture release];
cancelGesture = nil;
}
}
首先,你需要在搜索栏的参考。 让我们假设你的控制器对象具有对象引用的UISearchBar * theSearchBar,以及您为它分配当您创建的UISearchBar对象。
接下来,你需要检测,含观点已被触及。 被触摸的视图“知道”,但你需要获得这些信息给控制器。 可悲的是,苹果并没有提供一个简单的方法来做到这一点,但也不是没有那么难。
我的解决办法是更换标准的UIView是一个UIViewController对象通常与UIControl创建,然后进行的UIViewController响应触摸事件。
MainController.m
- (void) loadView {
UIControl *control = [[UIControl alloc] initWithFrame: <desired frame>];
[control addTarget: self action: @selector(touchUpInside)
forControlEvents: UIControlEventTouchUpInside];
// or touch down events, or whatever you like
self.view = control;
[control release];
}
- (void) viewDidLoad {
[super viewDidLoad];
theSearchBar = [[UISearchBar alloc] initWithFrame: <desired frame>];
// insert code to finish customizing the search bar
[self.view addSubview: theSearchBar];
}
- (void) touchUpInside {
if [theSearchBar isFirstResponder] {
// grab any data you need from the search bar
[theSearchBar resignFirstResponder];
}
}
MainController.h
@interface MainController : UIViewController
{
UISearchBar *theSearchBar;
}
澄清:
只有一个单一的对象 - 我们称之为类MainController - 这是的UIViewController的子类。 所有上面列出的方法在MainController实施。 theSearchBar被声明为.h文件一个UISearchBar *。
你定义使用界面生成您的视图和控制器? 如果是的话,我建议你学会如何不使用它 - 一旦你进入的那种,我们在这里讨论的技巧,它变得更加阻碍而不是帮助 - 我不使用它在所有的,直到永远。
@Gia党的答案是简单的,但我不子类UIView
,只有UIViewController
,所以我的电话略有不同。 此外,由于我不知道实际调用的开销resignFirstResponder
,我宁愿先检查。 这是更多的代码,但因为所有这一切都是主线程(可减慢UI)上完成的,我宁愿先检查一下。
@implementation MyController : UIViewController {
@private
UISearchController *_uiSearchController;
}
- (void)viewDidLoad {
// add tap on view to resign the responder if we're in the middle of typing in the search
UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(closeKeyboardIfNeeded)];
[self.view addGestureRecognizer:tapGestureRecognizer];
}
- (void)closeKeyboardIfNeeded {
if (![_uiSearchController.searchBar isFirstResponder]) {
return;
}
[_uiSearchController.searchBar resignFirstResponder];
}
@end
至于其他的答案,要小心约不断重新创建对象。 总有一个性能损失,无论是创作本身或垃圾收集通过ARC,而这些东西将你的主线程放缓。 根据你还做主线是什么,它可能有显著的性能影响。