当UITextField在UIScrollView中时,使用Tap Gesture关闭键盘的问题。

时间:2013-10-09 19:37:00

标签: iphone ios objective-c uiscrollview uitextfield

我设计了一个具有以下层次结构的应用程序:

UIViewController
  UIView
    UIScrollView
      UITextField

在我做过的ViewDidLoad上:

...
tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
    tapGesture.cancelsTouchesInView = NO;
    [self.scrollView addGestureRecognizer:tapGesture];
...

在hideKeyboard上我做了:

- (void) hideKeyboard {
    //Hide keyBoard
    [self.view endEditing:YES];
}

乍一看,它完美无缺,但不幸的是有一个问题。 当应用程序运行时,我们可以单击UITextField键盘按预期显示。如果我们单击UITextField侧,则调用方法hideKeyboard并按预期关闭键盘,但如果您再次单击UITextField,键盘将不会再次显示。

我做错了什么?有人知道吗?

3 个答案:

答案 0 :(得分:1)

每次需要用户反馈时都要处理这个问题。如果苹果在即将推出的框架版本中包含这样的日常功能,将会非常有用。

有一百一个建议的解决方案,用于在编辑过程中如何将UITextField和UITextView移出键盘 - 通常,它归结为观察

  1. UIKeyboardWillShowNotification和UIKeyboardWillHideNotification,或
  2. 实现UITextFieldDelegate委托方法,并调整超视图的框架,或
  3. 使用UITableView的scrollToRowAtIndexPath:atScrollPosition:animated:
  4. 但我发现的所有提议的解决方案往往都是DIY,必须为每个需要它的视图控制器实现。

    解决方案由Michael Tyson提供...... 用于将文本字段移出键盘的插入式通用解决方案 您可以在GitHub project page.

    上获取包含示例项目的源文件

答案 1 :(得分:0)

试试这个..

- (void) hideKeyboard 
{
    //Hide keyBoard
    [self.view endEditing:YES];
    [self.scrollView bringSubViewToFront:YourTextField];
}

答案 2 :(得分:0)

我曾经想要检测滚动视图上的触摸,类似于UIView上的触摸。

要访问滚动视图上的触摸,如触摸开始和触摸结束,其他此类方法我将UIScrollView子类化,并且我能够访问滚动视图上的所有触摸事件。

如果您想在UIView和UIScrollView上访问触摸事件,请尝试这样做。