iphoneのメッセージアプリケーションの最初の表示と同様に、送信した、または送信した最後のメッセージでユーザーのテーブルビューを作成しようとしています。私はこのコードを持っているが、それは私がユーザーに送信され、期待される結果を返すされたすべてのメッセージの中にスナップショットを保つ辞書の配列を反復処理するために動作しません:SwiftのsnapShot値を使用してTableViewCellを設定する
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! MyTableViewCell
func getMsg()-> Int{
var getIndex = Int()
let messageDb = Database.database().reference().child("iMessenger/Messages")
messageDb.observe(.childAdded) { (snapshot) in
if let snapshotvalue = snapshot.value as? [String:Any], let sender = snapshotvalue["sender"] as? String, let key = snapshotvalue["key"] as? String{
// I thought that I could iterate through my array of dictionaries taking care to find a matching sender value for the user at indexpath.row and the key for the message
for (index, dict) in newMessageDictArr.enumerated(){
if self.users[indexPath.row].userPhone == sender && dict["key"] == key{getIndex = index}}}}
return getIndex}
if newMessageDictArr.count != 0{
cell.userMessage.text = newMessageDictArr[getMsg()]["messageBody"]}
return cell}
私は問題をコードを持つことは
cell.userMessage.text = newMessageDictArr[getMsg()]["messageBody"]
はすべて私の細胞が[「するmessagebody」]の最初の値を持っているので、それは私のユーザーは私に同じメッセージを送っているように見えたすべてのようなものだなることです。私が間違ったところを見つけようとしています...
私のFireBase構造もありがとうございます。
{
"iMessenger" : {
"Messages" : {
"-KxDSQOBuCkpFdw4SPDh" : {
"messageBody" : "TEST ",
"receiver" : "+197862",
"sender" : "+16698"
},
"-KxBjNM_iA2XaapyyC9o" : {
"key" : "-KxBjNM_iA2XaapyyC9o",
"messageBody" : "TEST",
"receiver" : "+197862",
"sender" : "+1914862"
},
"Messages+199862+197862" : {
"-KxB7P-vgdfxRpSdnwCT" : {
"messageBody" : "yo, wassup world",
"receiver" : "+197862",
"sender" : "+199862"
},
"-KxB81fbn5_OHxdj4lcA" : {
"messageBody" : "Hello World",
"receiver" : "+19147862",
"sender" : "+1997862"
}
},
"Users" : {
"-Kx41o03NIMBR68F2sCS" : {
"displayName" : "sleeping beauty ",
"firstName" : "",
"lastName" : "",
"phoneNumber" : "+165698"
},
"-Kx42IXgN1z9D5Zoz0fk" : {
"displayName" : "KarmaDeli",
"firstName" : "",
"lastName" : "",
"phoneNumber" : "+1397862"
}}}}
このコードは正しく動作しません。奇妙なUIの問題を引き起こし、おそらく長期的には多くの作業になるでしょう。概念はノードにオブザーバーを添付し、アプリケーションがデータの追加、変更、または削除のイベントを受け取ったときに、それに応じてtableViewデータソース(通常は配列)を更新し、その配列からテーブルを読み込むtableViewをリロードします。あなたは、tableView:cellForRowAtメソッド内にオブザーバを追加したくない。質問には、送信または送信された最後のメッセージが挿入されることが記載されています。文字通り、あなたはtableViewに単一のメッセージがあることを意味しますか? – Jay
ああ、Firebaseの構造をTEXTとして追加してください。画像はありませんので、適切に回答をまとめることができます。 Firebaseのコンソール - > JSONの書き出しでFirebase構造を取得できます。小さなスニペットを含めるだけで、あなたが何を照会しようとしているのかを理解することができます。 (テキストを含む!) – Jay
okだから、tableviewのスナップショットを撮るのは悪い考えでした。私のtableViewは、現在2つのfireBaseの場所iMessenger/UsersとiMessenger/Messagesからデータを受け取ります。 1つのデータベースからのみテーブルビューを作成する方法を見つける必要がありますか?私が意味していたのは、携帯電話でアプリケーションを実行したときに、最初のmessageBody ["Hello world"]が表示されたことです。たとえば、いくつの新しいメッセージが送信されたとしても、そのテーブルのeverユーザーのcell.message.textにあります。 – KarmaDeli