2

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

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

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

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

此方法正常工作,但是我的视图控制器以模态方式呈现视图,因此它具有以下结构:

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

当视图 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];
}

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

编辑2:

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

- (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");
    }
}

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

4

2 回答 2

1

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

- (BOOL)disablesAutomaticKeyboardDismissal {
return NO;
}

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

[search resignFirstResponder];

或者

[self.view endEditing: YES];

键盘会很好地关闭!

于 2013-04-15T15:30:09.773 回答
0

而不是添加和删除您的手势-(void)searchBarTextDidBeginEditing:(UISearchBar *)search {并在viewDidDisappear中-(void)searchBarTextDidEndEditing:(UISearchBar *)search {执行它(在此处删除)。viewWillAppear' (add here) and

并假设您cancelGesture是具有属性的retain属性。添加手势时,请改为执行此操作

UITapGestureRecognizer *gesture = [UITapGestureRecognizer new];
[gesture addTarget:self action:@selector(backgroundTouched:)];
self.cancelGesture = gesture;
[self.view addGestureRecognizer:self.cancelGesture];

并记得cancelGesturedealloc.

于 2013-02-13T13:03:13.970 回答