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

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

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

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

TableView

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

Swift

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

Q&A

解決済

1回答

1020閲覧

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

ishiishiyay

総合スコア33

Firebase

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

TableView

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

Swift

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

0グッド

0クリップ

投稿2019/05/11 14:03

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

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

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

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

Swift

1class New { 2 private var _sender_id = ""; 3 private var _sender_name = ""; 4 private var _url = ""; 5 private var _timeStamp: NSNumber = 1 6 private var _toID = ""; 7 private var _childkey = ""; 8 private var _listened = false 9 private var _toName = ""; 10 11 init(sender_id: String, sender_name: String, url: String, toID: String, timeStamp: NSNumber , childkey: String, listened: Bool, toName: String) { 12 _sender_id = sender_id; 13 _url = url; 14 _toID = toID 15 _timeStamp = timeStamp 16 _childkey = childkey 17 _listened = listened 18 _sender_name = sender_name 19 _toName = toName 20 } 21 var sender_id: String? { 22 return _sender_id; 23 } 24 var sender_name: String? { 25 return _sender_name; 26 } 27 var toID: String? { 28 return _toID; 29 } 30 var toName: String? { 31 return _toName; 32 } 33 var url: String? { 34 return _url; 35 } 36 var timeStamp: NSNumber? { 37 return _timeStamp; 38 } 39 var childkey: String? { 40 return _childkey; 41 } 42 var listened: Bool? { 43 return _listened; 44 } 45}

Swift

1class NewTalkCollectionViewCell: UICollectionViewCell { 2 3 @IBOutlet weak var imgImg: UIImageView! 4 @IBOutlet weak var label: UILabel! 5 @IBOutlet weak var timeStamp: UILabel! 6 @IBOutlet weak var numberOfMessages: UILabel! 7 8 override func prepareForReuse() { 9 super.prepareForReuse() 10 self.imgImg.image = nil 11 } 12}

Swift

1 2class NewTalkVC: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate/*, FetchData*/ { 3 var news = [New]() 4 var newsDictionary = [String: New]() 5 var friendImage: UIImage? 6 var friendName: String = "" 7 var friendName2: String = "" 8 var toID: String = "" 9 var chatPartnerId: String = "" 10 var chatPartnerId2: String = "" 11 var chatPartnerName: String = "" 12 var messages = [Message]() 13 14 @IBOutlet weak var NewTalkCollectionView: UICollectionView! 15 16 17 override func viewDidLoad() { 18 super.viewDidLoad() 19 getNewTalk() 20 } 21 22//メッセージの情報を取得します 23 func getNewTalk() { 24 25 let uid = Auth.auth().currentUser?.uid 26 Database.database().reference().child("user-messages").child(uid!).observe(.childAdded, with: { (snapshot) in 27 let messageId = snapshot.key 28 DBProvider.Instance.mediaMessagesRef.child(messageId).observe(.value, with: { (snapshot) in 29 if let d = snapshot.value as? [String:AnyObject]{ 30 if let sender_id = d["sender_id"] as? String { 31 let sender_name = d["sender_name"] as? String 32 let timeStamp = d["timeStamp"] as? NSNumber 33 let toID = d["toID"] as? String 34 let toName = d["toName"] as? String 35 let listened = d["listened"] as? Bool 36 let childkey = d["childkey"] as? String 37 let url = d["url"] as? String 38 let newMessage = New(sender_id: sender_id, sender_name: sender_name!, url:url!, toID: toID!, timeStamp: timeStamp!, childkey: childkey!, listened: listened!, toName: toName!) 39 40 //送り主が自分なら、表示する名前とアイコンは、受信者。送り主が自分じゃないなら、表示するのは送信者。 41 if sender_id == Auth.auth().currentUser?.uid { 42 self.chatPartnerId = toID! 43 self.newsDictionary[self.chatPartnerId] = newMessage 44 //AさんからBさんに送ったメッセージ、それに対するBさんの返信、そしてまたAさんの返信、これら全ての個数分をTable Viewに表示するのではなく、あくまで相手のプロフ画像と最新時間だけ表示できればいいので、Arrayを使って1つのセルにまとめています。 45 self.news = Array(self.newsDictionary.values) 46 self.news.sort(by: {Double($0.timeStamp!) < Double($1.timeStamp!)}) 47 self.NewTalkCollectionView.reloadData() 48 } 49 50 51 //送る主が自分以外で、かつ、送り先が自分であるとき 52 else if toID == Auth.auth().currentUser?.uid { 53 self.chatPartnerId = sender_id 54 self.newsDictionary[self.chatPartnerId] = newMessage 55 self.news = Array(self.newsDictionary.values) 56                 self.NewTalkCollectionView.reloadData() 57 } 58 59 } 60 61 } 62 }, withCancel: nil) 63 64 }, withCancel: nil) 65 66 67 } //getNewTalk()終わり 68 69 70 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 71 return news.count 72 73 } 74 75 76 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 77 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "NewTalkCollectionViewCell", for: indexPath) as! NewTalkCollectionViewCell 78 let user = news[indexPath.row] 79 80 //相手のIDがとりたい。自分がsenderの時は、相手であるtoID(受信者ID)を使う。相手がsenderの時は、senderID(送信者ID)を使う。 81 if user.sender_id == Auth.auth().currentUser?.uid { 82 self.chatPartnerId2 = user.toID! 83 self.chatPartnerName = user.toName! 84 } else if user.sender_id == user.toID { 85 self.chatPartnerId2 = user.sender_id! 86 self.chatPartnerName = user.sender_name! 87 } 88 89 cell.label.text = self.chatPartnerName 90 91 if user.sender_id == Auth.auth().currentUser?.uid { 92 cell.label.text = user.toName 93 } 94 //送る主が自分以外で、かつ、送り先が自分であるとき 95 else if user.toID == Auth.auth().currentUser?.uid { 96 cell.label.text = user.sender_name 97 } 98 99 100 //友達の画像を取得 101 Database.database().reference().child("Contacts").child(self.chatPartnerId2).observeSingleEvent(of: .value, with: { (snapshot) in 102 if let dictionary = snapshot.value as? [String:AnyObject]{ 103 104 if let profileImageUrl = dictionary["profileImageUrl"] as? String { 105 let url = URL(string: profileImageUrl) 106 107 URLSession.shared.dataTask(with: url!, completionHandler: { (data, response, error) in 108 DispatchQueue.global().async{ 109 DispatchQueue.main.async{ 110 111 cell.imgImg.image = UIImage(data:data!) 112 113 } 114 } 115 }).resume() 116 } 117 } 118 }, withCancel: nil) 119 return cell 120 } 121 122 123}//class 124

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決しました。Timerを使用します。
https://www.youtube.com/watch?v=JK7pHuSfLyA&t=1473s

投稿2019/06/01 15:33

編集2019/06/01 15:34
ishiishiyay

総合スコア33

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問