取消的UISearchBar出来时,用户点击查看(Cancel out of UISearchBar

2019-08-01 10:55发布

有谁知道如何取消(辞职第一响应者)从一个UISearchBar当你点击下方的搜索文本框和键盘上方? 任何人都可以帮助发布一些代码来处理呢?

谢谢

Answer 1:

我从没有其它的想法iphonedevbook ,示例代码项目04,是用一个大的透明按钮位于这什么也不做的所有其他控件的后面,但如果窃听辞职所有的第一反应。 也就是说,如果用户点击任何地方还没有一个更重要的控制 - 这是直观的行为 - 搜索栏和键盘消失。



Answer 2:

添加在父视图敲击手势(所述的UISearchBar的)

[self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:searchBar action:@selector(resignFirstResponder)]];


Answer 3:

我做到了这一点通过使用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,分离到的手势会回应的区域。



Answer 4:

最后我用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;
    }
}


Answer 5:

首先,你需要在搜索栏的参考。 让我们假设你的控制器对象具有对象引用的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 *。

你定义使用界面生成您的视图和控制器? 如果是的话,我建议你学会如何不使用它 - 一旦你进入的那种,我们在这里讨论的技巧,它变得更加阻碍而不是帮助 - 我不使用它在所有的,直到永远。



Answer 6:

@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,而这些东西将你的主线程放缓。 根据你还做主线是什么,它可能有显著的性能影响。



文章来源: Cancel out of UISearchBar when user taps on view