2014-04-15 60 views
0

我有一个问题,每当我进入一个视图控制器 - 在下面的屏幕截图中的“MessageListViewController”,键盘将自动弹出。为什么当viewController被按下时键盘自动弹出

事情是我在这个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]); 

我也试图跟踪与关键窗口的第一个响应时键盘触发此调用堆栈将显示通知,并且出放仅仅是“无”。

Call stack of the keyboard will show notification catched

+0

在viewWillAppear方法中使用[self.view endEditing:YES]并查看它是否有效。 –

+0

尝试在从视图中出来时辞去键盘。 - (无效)ViewwillDisappear; – Romance

+0

谢谢Puneet,我试图把它放在很多地方,但它仍然不起作用。 – Pei

回答

1

我的iOS 7中创建一个演示按照你在你的问题说,这是工作的罚款对我来说,即使我没有调用resignFirstResponder方法辞职的键盘。所以你可以看看你的代码,因为你可能会调用becomeFirstResponder某处让键盘重新变为活动状态,或者只是在这里发布你的代码,这样我可以看看它。

1

感谢大家的帮助,我刚刚意识到问题出在哪里,实际上我没有声明我在这里使用的messagelistViewController实际上是一个singleton,所以即使我从viewController堆栈中弹出这个消息也不会释放。
在这种情况下,当下一次该视图控制器再次出现时,UIKit将足够聪明以恢复先前的视图状态,如果它没有被处理。
而在我的测试样本中,当它弹出堆栈时,我没有保留测试视图控制器。所以这就是为什么这对我的测试样品工作正常。
然后,我的最终解决方案有点简单,只需在视图消失时从其超级视图中移除文本视图,然后在视图出现时重新添加它。
原来我的问题是有点笨,但它也让我知道两件事情:

1)视图控制器将恢复到之前的状态在每次开机时,如果你不删除它

出现时间

2)如果手动退出第一响应者的输入,如果我们不想要这种效果,我们决不会手动解除它,键盘解除动画总是会停止。

相关问题