从某个视图控制器导航时如何记住键盘状态?
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
并为其赋值 true
或 false
,具体取决于聊天是否在进行中。
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
的实例后,您可以根据事件继续更新其参数。例如当用户开始与其他用户聊天时,您可以将 chatState
的 isChatInProgress
变量设置为 true
.
这种方法的另一个优点是,如果您想在应用程序的各个会话之间保持聊天状态,它也会很有帮助。您可以在您选择的任何数据存储(NSUserDefaults、CoreData、Sqlite)中存档 ChatState
个对象,并在以后检索它们。
我有一个聊天视图控制器,在将 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
并为其赋值 true
或 false
,具体取决于聊天是否在进行中。
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
的实例后,您可以根据事件继续更新其参数。例如当用户开始与其他用户聊天时,您可以将 chatState
的 isChatInProgress
变量设置为 true
.
这种方法的另一个优点是,如果您想在应用程序的各个会话之间保持聊天状态,它也会很有帮助。您可以在您选择的任何数据存储(NSUserDefaults、CoreData、Sqlite)中存档 ChatState
个对象,并在以后检索它们。