ios - 从模态视图返回后使用手势识别器关闭 UISearchBar 的键盘

标签 ios uigesturerecognizer uisearchbar uitapgesturerecognizer

我已经在我的应用程序中实现了 UISearchBar。我以编程方式创建它并在 View Controller (而不是 TableView )中使用它。它工作得很好,但我遇到的问题是使用手势识别器关闭键盘。我希望当用户点击键盘以外的屏幕时关闭键盘。

我知道有很多解决方案可以解决这个问题,但我有一个相当独特的问题,目前我无法弄清楚。我使用以下代码来实现这一点。

我将这一行放在我的 ViewController 的 viewDidLoad 方法中:

    [self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:search action:@selector(resignFirstResponder)]];

此方法正常工作,但我的 View Controller 以模态方式呈现 View ,因此它具有以下结构:

ViewController - 模态 -> view2 -模态 -> view3

当 View 2 和 3 被关闭并且我返回到 ViewController 时,手势识别器不再工作。在尝试我发现的另一种解决方案时,我遇到了同样的问题:

UIGestureRecognizer* cancelGesture;

- (void) backgroundTouched:(id)sender {
    [self.view endEditing:YES];
}

#pragma mark - UISearchBarDelegate

-(void)searchBarTextDidBeginEditing:(UISearchBar *)search {
    cancelGesture = [UITapGestureRecognizer new];
    [cancelGesture addTarget:self action:@selector(backgroundTouched:)];
    [self.view addGestureRecognizer:cancelGesture];
}

-(void)searchBarTextDidEndEditing:(UISearchBar *)search {
    if (cancelGesture) {
        [self.view removeGestureRecognizer:cancelGesture];
    }
}

我将这些添加到我的主 ViewController 中,开始时它再次运行良好,但从模态视图返回后,手势不再有效。

如有任何帮助,我们将不胜感激!

编辑 1:

因此在测试时我发现按下键盘上的搜索按钮时会产生类似的效果。按下搜索后,我使用以下代码关闭键盘:

- (void) searchBarSearchButtonClicked:(UISearchBar *)search
{
    [search resignFirstResponder];
}

这里的效果相同,当我第一次启动应用程序并进行一些搜索时工作正常,但是从我以模态呈现的 View Controller 返回到此屏幕后,按回车键不再关闭键盘。

编辑 2:

我什至尝试在 searchBarSearchButtonClicked 委托(delegate)方法中添加这段代码:

- (void) searchBarSearchButtonClicked:(UISearchBar *)search
{
    if ([search isFirstResponder]) {
        [search resignFirstResponder];
        NSLog(@"text field was first responder");
    } else {
        [search becomeFirstResponder];
        [search resignFirstResponder];
        NSLog(@"text field was not first responder");
    }
}

而且两次它都打印文本字段是第一响应者。从模态视图返回并再次单击搜索栏后,它仍然说它是第一响应者,但它并没有关闭,这很奇怪。对此的任何见解都会非常有帮助,谢谢。

最佳答案

好的,我知道问题出在哪里了。他们的第一响应者正在辞职,但键盘并没有因为焦点问题而消失。模态视图的默认行为是不关闭键盘(这显然不是错误)。因此,从模态视图返回后,它仍然具有这种行为(放弃第一响应者但不解除键盘)。我解决这个问题的方法是在两个模态视图 .m 文件中放置以下代码:

- (BOOL)disablesAutomaticKeyboardDismissal {
return NO;
}

这为我解决了。然后通过使用:

[search resignFirstResponder];

[self.view endEditing: YES];

键盘将关闭!

关于ios - 从模态视图返回后使用手势识别器关闭 UISearchBar 的键盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14853879/

相关文章:

ios - 我的 UISearchBar 移动到顶部(动画)--> 想要禁用

ios - Worldpay 的 Cocoa pods 安装问题

ios - 放入 UIImage 失败(Swift)

ios - 蓝牙可以触发应用程序中的特定操作吗?

ios - 如何使单元格中的 UIButton 在被点击后立即保留特定状态?

iphone - 如何在 iOS 中用一条线连接两个按钮(点)?

ios - IOS捏合手势的手势绑定(bind)限制

objective-c - NSUndoManager 使用旋转手势撤销 UIImage 旋转

ios - 覆盖 UISearchBar 的 TextField

ios - UISearchBar 访问 UIAccessibility 的明文按钮