从某个视图控制器导航时如何记住键盘状态?

How to remember keyboard state when navigating from certain view controller?

我有一个聊天视图控制器,在将 textview 作为第一响应者时,我会自动打开键盘(打开页面时)。但是,在我的聊天视图中,用户可以离开该页面以查看正在与之聊天的用户的个人资料。如何根据用户的行为改变键盘状态?

1) 如果用户单击消息线程,它将始终自动打开键盘。

2) 在聊天中,如果用户点击用户图片查看他们的个人资料,当他们返回聊天时它会记住键盘的状态。如果他们关闭了键盘,它不会加载键盘,如果它还在,它会加载键盘。

希望在这里得到一些帮助!谢谢。你们是最棒的:)

在你想要键盘自动打开的视图控制器上你想要这个功能在那里

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

  yourTextField.becomeFirstResponder()



}

然后为了保留那里的文本,您只需将值保存在全局变量中,然后将其粘贴回 return 上您想要的值返回控制器

如果你想记住状态,你可以使用 userdefaults 并设置一个标志来检查键盘是否被关闭,并使用基于该标志的条件逻辑

您的问题与您申请的 'Design' 方面密切相关。

我假设您的应用程序只有一个 UINavigationController,它保留了所有 UIViewController 实例的堆栈。 另外,我假设当用户离开 ChatViewController 屏幕时,您正在将新屏幕推到当前 ChatViewController 实例上,而不是弹出 ChatViewController 实例然后推到它上面。

考虑到以上 2 个假设,有很多方法可以实现您想要的。

快捷方式:

在您的 ChatViewController class 中声明一个 boolean 变量 isChatInProgress 并为其赋值 truefalse,具体取决于聊天是否在进行中。

 override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    if isChatInProgress {
        chatTextField.becomeFirstResponder()
    }
}

更好的方法

而不是仅仅声明一个 boolean 变量 isChatInProgress,你可以通过声明一个模型 class ChatState (sub[=在 Objective C 的情况下 NSObject 的 61=])。

class ChatState {

    var isChatInProgress : Bool
    var chatText : String
    var chatId: String
    .
    .
}

您可以在 ChatState class 中包含所有可能有助于定义聊天屏幕状态的变量。然后,在 class 的 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 的实例后,您可以根据事件继续更新其参数。例如当用户开始与其他用户聊天时,您可以将 chatStateisChatInProgress 变量设置为 true.

这种方法的另一个优点是,如果您想在应用程序的各个会话之间保持聊天状态,它也会很有帮助。您可以在您选择的任何数据存储(NSUserDefaults、CoreData、Sqlite)中存档 ChatState 个对象,并在以后检索它们。