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

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

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

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

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Swift

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

解決済

【Swift】Table Viewで正しいチャット相手の画像を取得する方法

ishiishiyay
ishiishiyay

総合スコア33

Firebase

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

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Swift

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

1回答

0評価

0クリップ

831閲覧

投稿2019/05/11 14:03

すみません、お力添え頂けますと幸いです。。。!

やりたいこと:
チャットアプリで、最新トーク一覧の画面を作っています。
チャット相手のプロフ画像と名前、一番新しいチャットが送信された時間などを表示させたいです。

LINEに例えると、以下の画面です。
イメージ説明
名前と最新メールの時刻は正しく表示させることができましたが、プロフィール画像のところに、正しい相手の画像が表示されません。Aさんのプロフ画像が、2名分の画像に表示されたり、Aさんの画像がBさんの画像のところに表示されたり、ビルドするときによって毎回バラバラです。どこか明らかにおかしいと箇所がありましたら、ご指摘頂けますと幸いでございます...

⬇︎FIrebaseから取得したメッセージ情報を入れるカスタムクラスです。

Swift

class New { private var _sender_id = ""; private var _sender_name = ""; private var _url = ""; private var _timeStamp: NSNumber = 1 private var _toID = ""; private var _childkey = ""; private var _listened = false private var _toName = ""; init(sender_id: String, sender_name: String, url: String, toID: String, timeStamp: NSNumber , childkey: String, listened: Bool, toName: String) { _sender_id = sender_id; _url = url; _toID = toID _timeStamp = timeStamp _childkey = childkey _listened = listened _sender_name = sender_name _toName = toName } var sender_id: String? { return _sender_id; } var sender_name: String? { return _sender_name; } var toID: String? { return _toID; } var toName: String? { return _toName; } var url: String? { return _url; } var timeStamp: NSNumber? { return _timeStamp; } var childkey: String? { return _childkey; } var listened: Bool? { return _listened; } }

Swift

class NewTalkCollectionViewCell: UICollectionViewCell { @IBOutlet weak var imgImg: UIImageView! @IBOutlet weak var label: UILabel! @IBOutlet weak var timeStamp: UILabel! @IBOutlet weak var numberOfMessages: UILabel! override func prepareForReuse() { super.prepareForReuse() self.imgImg.image = nil } }

Swift

class NewTalkVC: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate/*, FetchData*/ { var news = [New]() var newsDictionary = [String: New]() var friendImage: UIImage? var friendName: String = "" var friendName2: String = "" var toID: String = "" var chatPartnerId: String = "" var chatPartnerId2: String = "" var chatPartnerName: String = "" var messages = [Message]() @IBOutlet weak var NewTalkCollectionView: UICollectionView! override func viewDidLoad() { super.viewDidLoad() getNewTalk() } //メッセージの情報を取得します func getNewTalk() { let uid = Auth.auth().currentUser?.uid Database.database().reference().child("user-messages").child(uid!).observe(.childAdded, with: { (snapshot) in let messageId = snapshot.key DBProvider.Instance.mediaMessagesRef.child(messageId).observe(.value, with: { (snapshot) in if let d = snapshot.value as? [String:AnyObject]{ if let sender_id = d["sender_id"] as? String { let sender_name = d["sender_name"] as? String let timeStamp = d["timeStamp"] as? NSNumber let toID = d["toID"] as? String let toName = d["toName"] as? String let listened = d["listened"] as? Bool let childkey = d["childkey"] as? String let url = d["url"] as? String let newMessage = New(sender_id: sender_id, sender_name: sender_name!, url:url!, toID: toID!, timeStamp: timeStamp!, childkey: childkey!, listened: listened!, toName: toName!) //送り主が自分なら、表示する名前とアイコンは、受信者。送り主が自分じゃないなら、表示するのは送信者。 if sender_id == Auth.auth().currentUser?.uid { self.chatPartnerId = toID! self.newsDictionary[self.chatPartnerId] = newMessage //AさんからBさんに送ったメッセージ、それに対するBさんの返信、そしてまたAさんの返信、これら全ての個数分をTable Viewに表示するのではなく、あくまで相手のプロフ画像と最新時間だけ表示できればいいので、Arrayを使って1つのセルにまとめています。 self.news = Array(self.newsDictionary.values) self.news.sort(by: {Double($0.timeStamp!) < Double($1.timeStamp!)}) self.NewTalkCollectionView.reloadData() } //送る主が自分以外で、かつ、送り先が自分であるとき else if toID == Auth.auth().currentUser?.uid { self.chatPartnerId = sender_id self.newsDictionary[self.chatPartnerId] = newMessage self.news = Array(self.newsDictionary.values)                  self.NewTalkCollectionView.reloadData() } } } }, withCancel: nil) }, withCancel: nil) } //getNewTalk()終わり func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return news.count } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "NewTalkCollectionViewCell", for: indexPath) as! NewTalkCollectionViewCell let user = news[indexPath.row] //相手のIDがとりたい。自分がsenderの時は、相手であるtoID(受信者ID)を使う。相手がsenderの時は、senderID(送信者ID)を使う。 if user.sender_id == Auth.auth().currentUser?.uid { self.chatPartnerId2 = user.toID! self.chatPartnerName = user.toName! } else if user.sender_id == user.toID { self.chatPartnerId2 = user.sender_id! self.chatPartnerName = user.sender_name! } cell.label.text = self.chatPartnerName if user.sender_id == Auth.auth().currentUser?.uid { cell.label.text = user.toName } //送る主が自分以外で、かつ、送り先が自分であるとき else if user.toID == Auth.auth().currentUser?.uid { cell.label.text = user.sender_name } //友達の画像を取得 Database.database().reference().child("Contacts").child(self.chatPartnerId2).observeSingleEvent(of: .value, with: { (snapshot) in if let dictionary = snapshot.value as? [String:AnyObject]{ if let profileImageUrl = dictionary["profileImageUrl"] as? String { let url = URL(string: profileImageUrl) URLSession.shared.dataTask(with: url!, completionHandler: { (data, response, error) in DispatchQueue.global().async{ DispatchQueue.main.async{ cell.imgImg.image = UIImage(data:data!) } } }).resume() } } }, withCancel: nil) return cell } }//class

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Firebase

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

TableView

TableView(UITableView)とは、リスト形式で表示するコントロールで、ほとんどのアプリに使用されています。画面を「行」に分けて管理し、一般的には各行をタップした際に詳細画面に移動します。

Swift

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