続いてレイアウトの作成していきます。
配置したUIパーツと役割の説明
・TextView → リアルタイム更新のチャットのメッセージ表示
・TextField → 送信者の名前入力
・TextField → 送信者のメッセージの入力
・Button → ボタンタップでメッセージの送信
レイアウトが完成したら右クリックドラッグアンドドロップでOutletとActionをコードに追加します。
TextViewとTextFieldにはOutlet、ButtonにはActionを設定します。
設定が終わったらFirebaseを使うためのコードを書いていきます。
ViewControllerファイルでFirebaseDatabaseをimportします。
import FirebaseDatabase
ルートの指定をします。スクリーンショットの赤色の部分がルートだそうです。
var databaseRef: DatabaseReference!
override func viewDidLoad() {
super.viewDidLoad()
//ルートの指定
databaseRef = Database.database().reference()
}
これでデータベースにアクセスできるようになりました。
ここからは実際にデータベースを追加してみます。
送信ボタンのAction内で送信者の名前とメッセージの内容を送信しています。
//TextFieldに入力したテキストをセット
let messageInfo = ["name": nameTextField.text, "message": messageTextField.text]
//ルート→chat_room→AutoID(自動でID生成)の下に名前とメッセージデータを書き込み
self.databaseRef.child("chat_room").child(roomID).childByAutoId().setValue(messageInfo)
新しいデータが追加されたらチャット欄に反映する処理を作成します。
observeはデータの監視、.childAddedの部分は監視する条件の指定(データが追加されたとき)、snapshotは追加データを表します。
func observeChatMessage(databaseRef: DatabaseReference) {
//snapshotが追加データを表します
databaseRef.child("chat_room").child(roomID).observe(.childAdded) { snapshot in
//データのnilチェック、データが存在する場合key:valueの形で受け取ります
if let value = snapshot.value as? [String: Any] {
//名前とメッセージを指定したkeyで受け取ります。ない場合は空文字""としています。
let name = value["name"] as? String ?? ""
let message = value["message"] as? String ?? ""
//チャットのメッセージ表示用のTextViewにテキストを追加します。
self.realTimeChatTextView.text = self.realTimeChatTextView.text + "\n\(name):\(message)"
}
}
}
全体のコード
import UIKit
import FirebaseDatabase
class ViewController: UIViewController, UITextFieldDelegate {
var databaseRef: DatabaseReference!
//チャットルームのID 固定値としました
let roomID = "room1"
@IBOutlet weak var realTimeChatTextView: UITextView!
@IBOutlet weak var nameTextField: UITextField!
@IBOutlet weak var messageTextField: UITextField!
@IBAction func sendButtonAction(_ sender: Any) {
//TextFieldに入力したテキストをセット
let messageInfo = ["name": nameTextField.text, "message": messageTextField.text]
//ルート→chat_room→AutoID(自動でID生成)の下に名前とメッセージデータを書き込み
self.databaseRef.child("chat_room").child(roomID).childByAutoId().setValue(messageInfo)
}
override func viewDidLoad() {
super.viewDidLoad()
nameTextField.delegate = self
messageTextField.delegate = self
//ルート
databaseRef = Database.database().reference()
//初回データセット+追加データの監視
observeChatMessage(databaseRef: databaseRef)
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool{
// キーボードを閉じる
textField.resignFirstResponder()
return true
}
func observeChatMessage(databaseRef: DatabaseReference) {
//snapshotが追加データを表します
databaseRef.child("chat_room").child(roomID).observe(.childAdded) { snapshot in
//データのnilチェック、データが存在する場合key:valueの形で受け取ります
if let value = snapshot.value as? [String: Any] {
//名前とメッセージを指定したkeyで受け取ります。ない場合は空文字""としています。
let name = value["name"] as? String ?? ""
let message = value["message"] as? String ?? ""
//チャットのメッセージ表示用のTextViewにテキストを追加します。
self.realTimeChatTextView.text = self.realTimeChatTextView.text + "\n\(name):\(message)"
}
}
}
}