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

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

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

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

Swift

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

解決済

タイムライン画面から詳細画面へのデータの反映(Firebase)ができません

iOS25535009
iOS25535009

総合スコア0

Firebase

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

Swift

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

1回答

0評価

0クリップ

942閲覧

投稿2019/12/30 15:50

前提・実現したいこと

Xcode11.3
Swift5
macOSMojave10.14.6

フェイスブックのコメントボタンを押した時のような、タイムライン画面から個別の画面に遷移し、タイムラインで表示されていた画像やテキストなどが遷移先でも表示されるようにしたい

タイムライン画面ではUItableViewを使い、それぞれのセルはxibファイルを使い、データベースはFirebaseを使ってます。
遷移先にはUIView,UIButton,UILabelがあります。

発生している問題・エラーメッセージ

遷移先で画像やテキストが反映されない
didSelectRowAtでタップされたセル番号が判別されているようですが、その判別されたセル番号のデータを取得し、表示させることができません。

該当のソースコード

遷移元

Swift

import UIKit import Firebase class HomeViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { @IBOutlet weak var tableView: UITableView! var postArray: [PostData] = [] // DatabaseのobserveEventの登録状態を表す var observing = false override func viewDidLoad() { super.viewDidLoad() tableView.delegate = self tableView.dataSource = self let nib = UINib(nibName: "PostTableViewCell", bundle: nil) tableView.register(nib, forCellReuseIdentifier: "Cell") // テーブル行の高さをAutoLayoutで自動調整する tableView.rowHeight = UITableView.automaticDimension // テーブル行の高さの概算値を設定しておく // 高さ概算値 = 「縦横比1:1のUIImageViewの高さ(=画面幅)」+「いいねボタン、キャプションラベル、その他余白の高さの合計概算(=100pt)」 tableView.estimatedRowHeight = UIScreen.main.bounds.width + 100 } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) print("DEBUG_PRINT: viewWillAppear") if Auth.auth().currentUser != nil { if self.observing == false { // 要素が追加されたらpostArrayに追加してTableViewを再表示する let postsRef = Database.database().reference().child(Const.PostPath) postsRef.observe(.childAdded, with: { snapshot in print("DEBUG_PRINT: .childAddedイベントが発生しました。") // PostDataクラスを生成して受け取ったデータを設定する if let uid = Auth.auth().currentUser?.uid { let postData = PostData(snapshot: snapshot, myId: uid) self.postArray.insert(postData, at: 0) // TableViewを再表示する self.tableView.reloadData() } }) // 要素が変更されたら該当のデータをpostArrayから一度削除した後に新しいデータを追加してTableViewを再表示する postsRef.observe(.childChanged, with: { snapshot in print("DEBUG_PRINT: .childChangedイベントが発生しました。") if let uid = Auth.auth().currentUser?.uid { // PostDataクラスを生成して受け取ったデータを設定する let postData = PostData(snapshot: snapshot, myId: uid) // 保持している配列からidが同じものを探す var index: Int = 0 for post in self.postArray { if post.id == postData.id { index = self.postArray.firstIndex(of: post)! break } } // 差し替えるため一度削除する self.postArray.remove(at: index) // 削除したところに更新済みのデータを追加する self.postArray.insert(postData, at: index) // TableViewを再表示する self.tableView.reloadData() } }) // DatabaseのobserveEventが上記コードにより登録されたため // trueとする observing = true } } else { if observing == true { // ログアウトを検出したら、一旦テーブルをクリアしてオブザーバーを削除する。 // テーブルをクリアする postArray = [] tableView.reloadData() // オブザーバーを削除する let postsRef = Database.database().reference().child(Const.PostPath) postsRef.removeAllObservers() // DatabaseのobserveEventが上記コードにより解除されたため // falseとする observing = false } } } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return postArray.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // セルを取得してデータを設定する let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! PostTableViewCell cell.setPostData(postArray[indexPath.row]) // セル内のボタンのアクションをソースコードで設定する cell.likeButton.addTarget(self, action:#selector(handleButton(_:forEvent:)), for: .touchUpInside) return cell } //セルをタップしたら... func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { // タップされたセルの行番号を出力 print("\(indexPath.row)番目の行が選択されました。") //セルの選択を解除 tableView.deselectRow(at: indexPath, animated: true) //記事画面へ遷移 performSegue(withIdentifier: "Article", sender: nil) } // セル内のボタンがタップされた時に呼ばれるメソッド @objc func handleButton(_ sender: UIButton, forEvent event: UIEvent) { print("DEBUG_PRINT: likeボタンがタップされました。") // タップされたセルのインデックスを求める let touch = event.allTouches?.first let point = touch!.location(in: self.tableView) let indexPath = tableView.indexPathForRow(at: point) // 配列からタップされたインデックスのデータを取り出す let postData = postArray[indexPath!.row] // Firebaseに保存するデータの準備 if let uid = Auth.auth().currentUser?.uid { if postData.isLiked { // すでにいいねをしていた場合はいいねを解除するためIDを取り除く var index = -1 for likeId in postData.likes { if likeId == uid { // 削除するためにインデックスを保持しておく index = postData.likes.firstIndex(of: likeId)! break } } postData.likes.remove(at: index) } else { postData.likes.append(uid) } // 増えたlikesをFirebaseに保存する let postRef = Database.database().reference().child(Const.PostPath).child(postData.id!) let likes = ["likes": postData.likes] postRef.updateChildValues(likes) } } }

遷移先

Swift

import UIKit import Firebase import SVProgressHUD class ArticleViewController: UIViewController,UITextFieldDelegate { @IBOutlet weak var ArticleImage: UIImageView! @IBOutlet weak var ArticleLabel: UILabel! @IBOutlet weak var ArticleButton: UIButton! @IBOutlet weak var ArticleLilkeCount: UILabel! @IBOutlet weak var CommentLabel: UILabel! @IBOutlet weak var CommentTextField: UITextField! override func viewDidLoad() { super.viewDidLoad() self.CommentTextField.delegate = self CommentTextField.returnKeyType = .done } func setPostData(_ postData: PostData) { //イメージ画像 self.ArticleImage.image = postData.image //キャプションのテキスト self.ArticleLabel.text = "\(postData.name!) : \(postData.caption!)" //いいねの数 let likeNumber = postData.likes.count ArticleLilkeCount.text = "\(likeNumber)" // //日付 // let formatter = DateFormatter() // formatter.dateFormat = "yyyy-MM-dd HH:mm" // let dateString = formatter.string(from: postData.date!) // self.dateLabel.text = dateString //いいねボタン if postData.isLiked { let buttonImage = UIImage(named: "like_exist") self.ArticleButton.setImage(buttonImage, for: .normal) } else { let buttonImage = UIImage(named: "like_none") self.ArticleButton.setImage(buttonImage, for: .normal) } } //キーボードを閉じる @IBAction func textField(_ sender: Any) { CommentTextField.text = (sender as AnyObject).text } //コメント投稿ボタン @IBAction func CommentButton(_ sender: UIButton) { } }

試したこと

様々なネット上のやり方を試しましたが、うまくいきせん。(そもそもネット上で見つけられませんでした)

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Firebase

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

Swift

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