2017-06-19 25 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並設置一個標誌,這是檢查是鍵盤被解僱或不,並且使用基於該標誌的條件邏輯

相關問題