如何从某个视图控制器导航时记住键盘状态?
我有一个聊天视图控制器,我自动打开键盘(在打开页面时)使textview成为第一响应者。然而,在我的聊天视图中,用户可以离开页面来查看他们正在聊天的用户的个人资料。如何根据用户的行为改变键盘状态?如何从某个视图控制器导航时记住键盘状态?
1)如果用户点击消息线程,它将始终自动打开键盘。
2)在聊天过程中,如果用户点击用户的图片查看他们的个人资料,他们会回到聊天时记住键盘的状态。如果他们解散了键盘,它将不会加载键盘,如果键盘仍然弹起,它将加载键盘。
想在这里得到一些帮助!谢谢。你们是您想要的键盘自动打开视图控制器上最好的:)
您的问题与您的应用程序的“设计”方面密切相关。
我假设你的应用程序有一个单一的UINavigationController
,它保存了所有你的UIViewController
实例的堆栈。 此外,我假设当用户导航离开ChatViewController
屏幕时,您正在推送新屏幕覆盖当前ChatViewController
实例,而不是弹出ChatViewController
实例,然后推送它。
考虑到上述两个假设,有很多方法可以完成你想要的。
快速的方法:
在ChatViewController
类声明一个变量boolean
和isChatInProgress
分配给它的价值true
或false
,取决于聊天是否正在进行或没有。
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if isChatInProgress {
chatTextField.becomeFirstResponder()
}
}
更好的办法
而不是仅仅声明boolean
变量isChatInProgress
,可以使你的代码更面向对象和可扩展的(目标C的情况下NSObject
子类)声明模型类ChatState
。
class ChatState {
var isChatInProgress : Bool
var chatText : String
var chatId: String
.
.
}
可以包括可能在定义你ChatState
类内部聊天屏幕的状态有帮助的所有变量。然后,在你的类的viewDidLoad
方法只是初始化的ChatViewController
一个实例,像这样:
override func viewDidLoad() {
super.viewDidLoad()
self.chatState = ChatState(param1, param2, ...)
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if self.chatState.isChatInProgress {
chatTextField.becomeFirstResponder()
}
}
一旦你的ChatViewController
初始化实例,你可以不断更新,这取决于事件及其参数。对于例如当用户开始与其他用户聊天时,可以将isChatInProgress
变量chatState
设置为true
。
这种方法的另一个优点是,它也将有助于在您的应用程序的各种会话之间保持聊天状态。您可以在您选择的任何数据存储(NSUserDefaults,CoreData,Sqlite)中归档ChatState
对象,并在稍后检索它们。
你想在那里
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
yourTextField.becomeFirstResponder()
}
那么这个功能,以保持这是那里你可以只保存值的文本在一个全局变量,并坚持它回到你想要返回到控制器的价值
如果你想记住的状态,你可以使用userdefaults并设置一个标志,这是检查是键盘被解雇或不,并且使用基于该标志的条件逻辑
令人惊叹的反应!非常感谢你:)这非常有帮助! – ryangineer