2

在视图 A 中,我有一个文本字段。我点击一个控件来推入一个新的视图控制器 B。视图 B 只有一个文本视图,它的框架应该调整以适应键盘,我总是将文本视图设置为第一响应者,并且键盘应该在视图时立即显示B被推了进去。

我在视图控制器 B 中进行通常的键盘通知处理。因此,如果在推送视图 B 之前未显示键盘,则没有问题。但是,如果视图 A 中的文本字段是第一响应者并且当我推入视图控制器 B 时键盘已经显示,我将不会收到 UIKeyboardWillShowNotification/UIKeyboardDidShowNotification。有什么建议来处理这种情况吗?

4

6 回答 6

1

我以前没有遇到过这个问题,但我有一个建议。也许在视图 B 中,你可以让你的 textViewresignFirstResponder然后becomeFirstResponder强制键盘通知出来。下面的示例:

[textView resignFirstResponder];
[textView becomeFirstResponder];

还有另一种绕行的方式,也许你可以resignFirstResponder在 View A 之前 push ,然后becomeFirstResponder在 View B 之后是viewDidAppear

希望能帮助到你。

于 2012-04-07T05:17:04.300 回答
0

您可以将键盘状态信息传递给 viewController B ...这不是一个好方法,但是我尝试了其他一些方法,例如在 viewController A 的 viewWillDisappear 中调用 [textView resignFirstResponder] ,它们都不起作用。

于 2012-04-07T06:34:14.413 回答
0

辞去第一响应者然后再次成为第一响应者并不是一个好的解决方案,我第一次想到它时就立即放弃了。当键盘已经存在时,强制键盘立即隐藏并再次显示是不正确的做法——这是一种浪费,会破坏平滑过渡。

通过破坏 B 的封装将键盘状态从视图 A 发送到视图 B 在软件工程中既不是可接受的事情。

所以我相信它值得一个错误报告,我做了一个 - #11205521

于 2012-04-07T16:10:46.233 回答
0

你应该试试UITouch

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
  // Detect touch anywhere
  UITouch *touch = [touches anyObject];

  // Get the point that was touched
  CGPoint point = [touch locationInView:self.view];
  NSLog(@"pointx: %f pointy:%f", point.x, point.y);

  // Check if the point touched is within these rectangular bounds
  if (CGRectContainsPoint(CGRectMake(5, 5, 40, 130), point))
  {
    //do something...
  } 
}
于 2012-07-29T16:33:32.460 回答
0

嗨,根据键盘调整视图大小我使用这样的东西

- (void) animateView: (BOOL) up
{
    CGRect rect = self.view.frame;

    if(up)
    {
        float movement = (up ? 264 : 416);
        rect.size.height = movement;
        self.view.frame = rect;
    }
    else
    {
        rect.size.height = 480;
        self.view.frame = rect;
    }
}

BOOL 变量 up 用于指示是否显示键盘

希望这可以帮助!

问候, 豪尔赫

于 2012-11-15T19:01:08.603 回答
0

您可以在应用程序的某个中心位置(例如 appDelegate)监控键盘状态,并让所有组件从中获取当前键盘信息。

于 2014-09-16T16:54:44.233 回答