我遇到的问题是,每当我进入视图控制器时 - 在下面的屏幕截图中都是“MessageListViewController”,键盘将自动弹出。
问题是我在这个MessageListViewController中使用UITextView进行文本输入,当我从navigationController堆栈中弹出这个视图控制器时,如果我让键盘保持打开状态,那么下次再次按下它时,会弹出这个键盘自动退出。
如果我在弹出这个视图控制器之前使文本视图resignFirstResponder,那么下次输入它就没问题了。然而,手动resignFirstResponder将使键盘解除丑陋的动画(手动关闭键盘会使键盘始终垂直向下移动屏幕,但视图控制器弹出事务是水平的,所以看起来非常有线)
我尝试构建一个简单的示例来测试键盘关闭行为 - 有两个视图控制器,一个是navigationController的rootViewController,它将另一个推入viewController堆栈,因此推送的视图控制器包含一个UITextView,如果我突出显示被推送的文本视图,然后返回到根视图控制器,动画工作正常,键盘也不会自动弹出。所以我只是不知道为什么在我的项目中,如果我刚离开页面而没有手动关闭键盘,这个键盘总会出现意外。
顺便说一下,在viewWillAppear和viewDidAppear之间发生了以下调用堆栈。看起来像是由iOS触发来恢复UITextView的最后状态。
- (UIView*)findFirstResponder {
if (self.isFirstResponder) {
return self;
}
for (UIView* subview in self.subviews) {
UIView* ret = [subview findFirstResponder];
if (ret) {
return ret;
}
}
return nil;
}
NSLog(@"%@", [[[UIApplication sharedApplication] keyWindow] findFirstResponder]);
当键盘触发的调用堆栈显示通知时,我还尝试使用键窗口的第一响应者进行跟踪,输出只是“nil”。
答案 0 :(得分:1)
我按照你在问题中的说法在iOS 7中创建了一个演示,它对我来说工作正常,即使我没有调用resignFirstResponder方法来重新调整键盘。因此,您可以查看代码,因为您可能已经在某处调用 becomeFirstResponder ,使键盘再次处于活动状态,或者只是在此处发布代码,以便我可以查看它。
答案 1 :(得分:1)
谢谢大家的帮助,我刚才意识到问题出在哪里,实际上我并没有声明我在这里使用的messagelistViewController实际上是一个单例,所以它永远不会释放,即使我将它弹出viewController堆栈。 />
在这种情况下,当下次再次出现此视图控制器时,如果未取消分配,UIKit将足够智能以恢复先前的视图状态。
在我的测试示例中,当它从堆栈中弹出时,我没有保留测试视图控制器。
这就是为什么这对我的测试样品很好
然后我的最终解决方案有点简单,只需在视图消失后从其超级视图中删除textview,然后在视图出现时重新添加它。
事实证明我的问题有点愚蠢,但它让我知道两件事:
1)如果您不删除它,视图控制器将在每次出现时恢复到之前的状态
2)如果手动重新设置第一响应者的输入,键盘消除动画将一直停止,如果我们不想要这种效果,我们永远不会手动解除它。