質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

受付中

Firebaseのリアルタイムデータベースを使ったチャットで個別に連絡を取れるようにしたい

madao
madao

総合スコア0

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

1回答

0評価

0クリップ

1904閲覧

投稿2017/04/10 06:36

swift

import UIKit import JSQMessagesViewController import Firebase import FirebaseDatabase class ChatViewController: JSQMessagesViewController { var messages = [JSQMessage]() override func viewDidLoad() { super.viewDidLoad() senderDisplayName = "A" senderId = FIRAuth.auth()?.currentUser?.uid let ref = FIRDatabase.database().reference() ref.observe(.value, with: { snapshot in guard let dic = snapshot.value as? Dictionary<String, AnyObject> else { return } guard let posts = dic["messages"] as? Dictionary<String, Dictionary<String, AnyObject>> else { return } // keyとdateが入ったタプルを作る var keyValueArray: [(String, Int)] = [] for (key, value) in posts { keyValueArray.append((key: key, date: value["date"] as! Int)) } keyValueArray.sort{$0.1 < $1.1} // タプルの中のdate でソートしてタプルの順番を揃える(配列で) これでkeyが順番通りになる // messagesを再構成 var preMessages = [JSQMessage]() for sortedTuple in keyValueArray { for (key, value) in posts { if key == sortedTuple.0 { // 揃えた順番通りにメッセージを作成 let senderId = value["senderId"] as! String! let text = value["text"] as! String! let displayName = value["displayName"] as! String! preMessages.append(JSQMessage(senderId: senderId, displayName: displayName, text: text)) } } } self.messages = preMessages self.collectionView.reloadData() }) } override func collectionView(_ collectionView: JSQMessagesCollectionView, messageDataForItemAt indexPath: IndexPath) -> JSQMessageData { return messages[indexPath.item] } override func collectionView(_ collectionView: JSQMessagesCollectionView!, messageBubbleImageDataForItemAt indexPath: IndexPath) -> JSQMessageBubbleImageDataSource? { if messages[indexPath.row].senderId == senderId { return JSQMessagesBubbleImageFactory().outgoingMessagesBubbleImage( with: UIColor(red: 112/255, green: 192/255, blue: 75/255, alpha: 1)) } else { return JSQMessagesBubbleImageFactory().incomingMessagesBubbleImage( with: UIColor(red: 229/255, green: 229/255, blue: 229/255, alpha: 1)) } } //cellForItemAtIndexPathのIndexPathを削除、whiteColor()、grayColor()のColor()を削除。 override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = super.collectionView(collectionView, cellForItemAt: indexPath) as? JSQMessagesCollectionViewCell if messages[indexPath.row].senderId == senderId { cell?.textView?.textColor = UIColor.white } else { cell?.textView?.textColor = UIColor.darkGray } return cell! } override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return messages.count } override func collectionView(_ collectionView: JSQMessagesCollectionView!, avatarImageDataForItemAt indexPath: IndexPath) -> JSQMessageAvatarImageDataSource? { return JSQMessagesAvatarImageFactory.avatarImage( withUserInitials: messages[indexPath.row].senderDisplayName, backgroundColor: UIColor.lightGray, textColor: UIColor.white, font: UIFont.systemFont(ofSize: 10), diameter: 30) } override func didPressSend(_ button: UIButton!, withMessageText text: String!, senderId: String!, senderDisplayName: String!, date: Date!) { inputToolbar.contentView.textView.text = "" let ref = FIRDatabase.database().reference() ref.child("messages").childByAutoId().setValue( ["senderId": senderId, "text": text, "displayName": senderDisplayName , "date":[".sv": "timestamp"]]) } }

上記のように実装したんですが、固有のsenderIdとのチャットをするにはどうすればいいんでしょうか?

枠をif文を変えてなくしたりは、できるんですがやはり、文字が無くなりません。文字を乗せるようなif文もないため、どこを変えるべきかわかりません。
この場合Firebaseのルールを変えるしかないのでしょうか?ご教授願います。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています