2017-06-19 56 views
0

我有一个聊天视图控制器,我自动打开键盘(在打开页面时)使textview成为第一响应者。然而,在我的聊天视图中,用户可以离开页面来查看他们正在聊天的用户的个人资料。如何根据用户的行为改变键盘状态?如何从某个视图控制器导航时记住键盘状态?

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

2)在聊天过程中,如果用户点击用户的图片查看他们的个人资料,他们会回到聊天时记住键盘的状态。如果他们解散了键盘,它将不会加载键盘,如果键盘仍然弹起,它将加载键盘。

想在这里得到一些帮助!谢谢。你们是您想要的键盘自动打开视图控制器上最好的:)

回答

1

您的问题与您的应用程序的“设计”方面密切相关。

我假设你的应用程序有一个单一的UINavigationController,它保存了所有你的UIViewController实例的堆栈。 此外,我假设当用户导航离开ChatViewController屏幕时,您正在推送新屏幕覆盖当前ChatViewController实例,而不是弹出ChatViewController实例,然后推送它。

考虑到上述两个假设,有很多方法可以完成你想要的。

快速的方法:

ChatViewController类声明一个变量booleanisChatInProgress分配给它的价值truefalse,取决于聊天是否正在进行或没有。

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对象,并在稍后检索它们。

+0

令人惊叹的反应!非常感谢你:)这非常有帮助! – ryangineer

0

你想在那里

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

    yourTextField.becomeFirstResponder() 



} 

那么这个功能,以保持这是那里你可以只保存值的文本在一个全局变量,并坚持它回到你想要返回到控制器的价值

如果你想记住的状态,你可以使用userdefaults并设置一个标志,这是检查是键盘被解雇或不,并且使用基于该标志的条件逻辑

相关问题