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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

1252閲覧

【Swift,Xcode】FIrebaseのデータをセルに表示するはずが、全てのセルが同じ内容になってしまう

nekokichi

総合スコア54

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2018/10/07 01:58

編集2018/10/07 01:59

Firebaseにデータを保存し、セルに表示する機能を実装したいです。

前回の質問で、セルに1つのデータしか表示されない問題は解決しました。

しかし、複数個のセルは表示されるのですが、全てのセルが全く同じ内容になっているのです。

イメージ説明

いくら更新しても改善されません。

そこで、Firebaseのデータを配列で格納するposts配列の中身を出力してみると、

swift

1[<MiniBlogApp.Post: 0x600000b7ccc0>, 2 <MiniBlogApp.Post: 0x600000b7ccc0>, 3 <MiniBlogApp.Post: 0x600000b7ccc0>, 4 <MiniBlogApp.Post: 0x600000b7ccc0>, 5 <MiniBlogApp.Post: 0x600000b7ccc0>]

イメージ説明
全ての要素が同じデータになっています。

FirebaseのDatabaseも確認しましたが、問題なく保存されています。

イメージ説明

原因がわからず困っています。

どうか解決法を教えていただけないでしょうか?

swift

1import UIKit 2import SDWebImage 3import Firebase 4 5class TimeLineViewController: UIViewController,UITableViewDelegate,UITableViewDataSource { 6 7 @IBOutlet weak var tableView: UITableView! 8 9 //Postクラスに関連する変数 10 var posts = [Post]() 11 var posst = Post() 12 13 //refleshのインスタンス 14 let reflesh = UIRefreshControl() 15 16 override func viewDidLoad() { 17 super.viewDidLoad() 18 19 tableView.delegate = self 20 tableView.dataSource = self 21 22 reflesh.attributedTitle = NSAttributedString(string: "更新する") 23 reflesh.addTarget(self, action: #selector(update), for: .valueChanged) 24 tableView.addSubview(reflesh) 25 26 // Do any additional setup after loading the view. 27 } 28 29 override func viewWillAppear(_ animated: Bool) { 30 super.viewWillAppear(animated) 31 32 update_Firebase() 33 34 tableView.reloadData() 35 36 } 37 38 func numberOfSections(in tableView: UITableView) -> Int { 39 return 1 40 } 41 42 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 43 return posts.count 44 } 45 46 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 47 48 let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 49 50// let daytimeLabel = cell.viewWithTag(1) as! UILabel 51// daytimeLabel.text = posts[indexPath.row].daytime 52 53 let categoryLabel = cell.viewWithTag(2) as! UILabel 54 categoryLabel.text = self.posts[indexPath.row].category 55 56 let titleLabel = cell.viewWithTag(3) as! UILabel 57 titleLabel.text = self.posts[indexPath.row].title 58 59 let imageView = cell.viewWithTag(4) as! UIImageView 60 let imageURL = URL(string: self.posts[indexPath.row].pictureURLString as String)! 61 imageView.sd_setImage(with: imageURL, completed: nil) 62 imageView.clipsToBounds = true 63 64 let sentenceLabel = cell.viewWithTag(5) as! UILabel 65 sentenceLabel.text = self.posts[indexPath.row].sentence 66 67 68 return cell 69 } 70 71 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 72 return 460 73 } 74 75 //データ更新メソッドを実行 76 @objc func update() { 77 78 //データを更新 79 update_Firebase() 80 //更新をストップ 81 reflesh.endRefreshing() 82 print(posts) 83 } 84 85 //データ更新メソッド 86 func update_Firebase() { 87 88 //データベースの参照URL 89 let ref = Database.database().reference() 90 91 self.posst = Post() 92 93 //post階層のデータをsnapで取り出す 94 //データを["???":データの型]で取得する 95 ref.child("post").observeSingleEvent(of: .value) { (snap,error) in 96 97 98 let snapData = snap.value as? [String:NSDictionary] 99 100 if snapData == nil { 101 return 102 } 103 104 self.posts = [Post]() 105 106 for (_,post) in snapData! { 107 108 print("表示します") 109 110 if let title = post["title"] as? String, let sentence = post["sentence"] as? String, let pictureURLString = post["pictureURLString"] as? String, let category = post["category"] as? String { 111 112 print("表示されます") //ここは通ります。 113 114 self.posst.title = title 115 self.posst.sentence = sentence 116 self.posst.pictureURLString = pictureURLString 117 self.posst.category = category 118 119 //Databaseにあるデータを全て表示してくれてます。 120 print("(self.posst.title), (self.posst.sentence), (self.posst.pictureURLString), (self.posst.category)") 121 122 } 123 124 self.posts.append(self.posst) 125 126 print(self.posts) 127 128 } 129 130 self.tableView.reloadData() 131 132 } 133 134 135 } 136 137}

swift

1import UIKit 2import SDWebImage 3import Firebase 4 5class ShareViewController: UIViewController,UITextFieldDelegate,UIImagePickerControllerDelegate,UINavigationControllerDelegate,UITextViewDelegate { 6 7 //アルバムで選択した画像のURL 8 var url = String() 9 10 @IBOutlet weak var titleField: UITextField! 11 @IBOutlet weak var imageView: UIImageView! 12 @IBOutlet weak var textView: UITextView! 13 @IBOutlet weak var categoryField: UITextField! 14 15 override func viewDidLoad() { 16 super.viewDidLoad() 17 18 // Do any additional setup after loading the view. 19 } 20 21 @IBAction func albumPicker(_ sender: Any) { 22 let sourceType:UIImagePickerController.SourceType = UIImagePickerController.SourceType.photoLibrary 23 24 if UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.SourceType.photoLibrary){ 25 let cameraPicker = UIImagePickerController() 26 cameraPicker.sourceType = sourceType 27 cameraPicker.delegate = self 28 self.present(cameraPicker, animated: true, completion: nil) 29 30 } 31 } 32 33 // 撮影が完了時した時に呼ばれる 34 @objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { 35 36 if let pickedImage = info[.originalImage] as? UIImage { 37 38 imageView.image = pickedImage 39 40 } else { 41 42 print("画像を設定できませんでした。") 43 44 } 45 46 //カメラ画面(アルバム画面)を閉じる処理 47 picker.dismiss(animated: true, completion: nil) 48 49 } 50 51 //投稿ボタン 52 @IBAction func postButton(_ sender: Any) { 53 54 //Firebaseにデータを保存する 55 let rootRef = Database.database().reference(fromURL: "https://miniblogfirebase.firebaseio.com/").child("post").childByAutoId() 56 //ストレージの参照URL 57 let storageRef = Storage.storage().reference(forURL: "gs://miniblogfirebase.appspot.com") 58 let key = rootRef.key 59 let imageRef = storageRef.child("Users").child("(key).jpg") 60 61 var data = NSData() 62 63 if let image = imageView.image { 64 data = image.jpegData(compressionQuality: 0.01)! as NSData 65 print("圧縮されました") 66 } 67 68 let uploadTask = imageRef.putData(data as Data, metadata: nil) { (metaData, error) in 69 70 if error != nil { 71 print("画像のエラーです") 72 return 73 } else { 74 75 imageRef.downloadURL(completion: { (url, error) in 76 77 if url != nil { 78 79 let feed = ["title":self.titleField.text ?? "title", 80 "sentence":self.textView.text ?? "sentence", 81 "pictureURLString":url?.absoluteString ?? "url", 82 "category":self.categoryField.text ?? "category"] as [String:Any] 83 84 rootRef.setValue(feed) 85 86 } else { 87 print("投稿できませんでした") 88 } 89 90 }) 91 92 } 93 94 } 95 96 uploadTask.resume() 97 dismiss(animated: true, completion: nil) 98 99 } 100 101 //キーボードを閉じる処理 102 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 103 titleField.resignFirstResponder() 104 categoryField.resignFirstResponder() 105 textView.resignFirstResponder() 106 } 107 108 @IBAction func backButton(_ sender: Any) { 109 dismiss(animated: true, completion: nil) 110 } 111 112 113 114} 115

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

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

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

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

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

guest

回答1

0

ベストアンサー

posstをプロパティにして使いまわしているのが原因じゃないかと。

Swift

1var p = Post() 2p.title = title 3//... 4self.posts.append(p)

投稿2018/10/07 04:05

daisuke7

総合スコア1563

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問