gpt4 book ai didi

ios - 为什么按下 viewController 时键盘自动弹出

转载 作者:行者123 更新时间:2023-11-28 22:10:20 25 4
gpt4 key购买 nike

我有一个问题,每次当我进入一个 View Controller 时——也就是下面截图中的“MessageListViewController”,键盘会自动弹出。

问题是我在这个 MessageListViewController 中使用了一个 UITextView 来进行文本输入,当我从 navigationController 堆栈中弹出这个 View Controller 时,如果我让键盘保持打开状态,那么下次再次按下时,这个键盘就会弹出自动退出。

如果我在弹出这个 View Controller 之前让 TextView resignFirstResponder,那么下次进入它就可以了。然而,手动 resignFirstResponder 将使键盘关闭并出现丑陋的动画(手动关闭键盘会使键盘始终垂直向下移动,但是 View Controller 弹出事务是水平的,因此看起来很连线)

我试图构建一个简单的示例来测试键盘关闭行为 - 有两个 View Controller ,一个是 navigationController 的 rootViewController,它会将另一个插入 viewController 堆栈,因此插入的 View Controller 包含一个 UITextView,如果我突出显示推送的 TextView ,然后返回到 Root View Controller ,动画效果很好,键盘也不会自动弹出。所以我只是不知道为什么在我的项目中,如果我只是离开页面而没有手动关闭键盘,这个键盘总是意外出现。

顺便说一句,以下调用堆栈发生在 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”。

Call stack of the keyboard will show notification catched

最佳答案

感谢大家的帮助,我才意识到问题出在哪里,实际上我没有声明我在这里使用的 messagelistViewController 实际上是一个单例,所以即使我将它从 viewController 堆栈中弹出,它也不会释放。
在这种情况下,当下一次这个 View Controller 再次出现时,UIKit 将足够聪明地恢复以前的 View 状态,如果它没有被释放的话。
在我的测试示例中,当测试 View Controller 从堆栈中弹出时,我没有保留它。所以这就是为什么这适用于我的测试样本。
然后我的最终解决方案有点简单,当 View 确实消失时,只需从它的 super View 中删除 TextView ,然后在 View 出现时重新添加它。
事实证明我的问题有点愚蠢,但它确实让我知道了两件事:

1) 如果你不删除 View Controller ,它每次出现都会恢复到之前的状态

2) 如果手动退出第一响应者的输入,键盘关闭动画将始终关闭,如果我们不想要这种效果,我们永远不会手动关闭它。

关于ios - 为什么按下 viewController 时键盘自动弹出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23075747/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com