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

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

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

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

Swift

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

Q&A

解決済

1回答

1833閲覧

コメント投稿機能を実装したが、投稿ボタンを押したと同時にテーブルビューに反映されない

iOS25535009

総合スコア12

Firebase

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

Swift

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

0グッド

2クリップ

投稿2020/01/18 15:45

前提

SNSアプリを作っています。tableViewのタイムライン画面の一記事をタップして記事の個別画面へ遷移し、そこでコメント投稿をする。コメントはtextFieldに入力し、tebaleViewに表示される。

##実現したいこと
TextFieldで入力したコメントを投稿ボタンを押してテーブルビューに即座に反映させたい。

投稿ボタンを押してFirebaseへの保存は問題なくできています。
一旦前ページ(タイムライン画面)に戻ってから記事個別画面に戻るとコメントは反映されています。

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

テーブルに変更を加えたと同時にFirebaseからコメントデータを呼び出して表示するところでつまづいています

該当のソースコード

コメントをする記事個別画面

swift5

1import UIKit 2import Firebase 3import SVProgressHUD 4 5class ArticleViewController: UIViewController,UITextFieldDelegate, UITableViewDataSource, UITableViewDelegate { 6 7 @IBOutlet weak var articleImage: UIImageView! 8 @IBOutlet weak var articleLabel: UILabel! 9 @IBOutlet weak var articleButton: UIButton! 10 @IBOutlet weak var articleLilkeCount: UILabel! 11 @IBOutlet weak var commentTextField: UITextField! 12 @IBOutlet weak var commentTableView: UITableView! 13 14 //textFieldが動くようにする 15 private var activeTextField: UITextField? 16 17 //前画面からデータを受け取るための変数 18 var postDataReceived: PostData? 19 20 // DatabaseのobserveEventの登録状態を表す 21 var observing = false 22 23 override func viewDidLoad() { 24 super.viewDidLoad() 25 26 commentTableView.delegate = self 27 commentTableView.dataSource = self 28 // テーブルセルのタップを無効にする 29 commentTableView.allowsSelection = false 30 31 //xibファイルに作成したセルの定義内容をUINib(nibName:bundle)で取得します。これをOutletで接続しているTableViewにregister(_:forCellReuseIdentifier:)メソッドで登録します。 32 let nib = UINib(nibName: "CommentTableViewCell", bundle: nil) 33 commentTableView.register(nib, forCellReuseIdentifier: "CommentCell") 34 35 // テーブル行の高さをAutoLayoutで自動調整する 36 commentTableView.rowHeight = UITableView.automaticDimension 37 // テーブル行の高さの概算値を設定しておく 38 // 高さ概算値 = 「縦横比1:1のUIImageViewの高さ(=画面幅)」+「いいねボタン、キャプションラベル、その他余白の高さの合計概算(=100pt)」 39 commentTableView.estimatedRowHeight = UIScreen.main.bounds.width 40 41 //textFieldがキーボードで隠れないようにする 42 self.commentTextField.delegate = self 43 self.setUpNotificationForTextField() 44 45 } 46 47 48 override func viewWillAppear(_ animated: Bool) { 49 super.viewWillAppear(animated) 50 51 guard let postData = postDataReceived else { 52 return 53 } 54 55 //イメージ画像 56 self.articleImage.image = postData.image 57 //キャプションのテキスト 58 self.articleLabel.text = "(postData.caption!)" 59 //いいねの数 60 let likeNumber = postData.likes.count 61 articleLilkeCount.text = "(likeNumber)" 62} 63 func setPostData(_ postData: PostData) { 64 postDataReceived = postData 65 } 66 67 //コメントテーブルビュー:セルの数はpostArrayの数 68 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 69 if let postData = postDataReceived { 70 return postData.comments.count //コメントの数を返す 71 } else { 72 return 0 //`postDataReceived`がnilなら0 73 } 74 } 75 //コメントテーブルビュー:セル構築の際 76 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 77 78 // セルを取得してデータを設定する 79 let cell = tableView.dequeueReusableCell(withIdentifier: "CommentCell", for: indexPath) as! CommentTableViewCell 80 81 //### `postDataReceived`がnilの時に呼ばれる可能性もあるので、条件付きバインディングで判定 82 guard let postData = postDataReceived else { 83 return cell 84 } 85 86 //テキストを初期化 87 //`indexPath`番目のコメントを設定 88 cell.commentLabel.text = postData.comments[indexPath.row] 89 90 // セル内のUI要素にアクションを設定する場合、古いアクションをクリアしないといけない 91 cell.goodButton.removeTarget(self, action: nil, for: .touchUpInside) 92 93 // セル内のボタンのアクションをソースコードで設定する 94 cell.goodButton.addTarget(self, action:#selector(handleGoodButton(_:forEvent:)), for: .touchUpInside) 95 96 return cell 97 } 98 //コメント投稿ボタン 99 @IBAction func commentButton(_ sender: UIButton) { 100 // 前画面から受け取ったデータを取り出す 101 guard let postData = postDataReceived else { 102 return 103 } 104 print("DEBUG_PRINT: コメントが投稿されました。") 105 106 //cell.textField.textがnilじゃなかったら、commentTextとする 107 if let commentText = self.commentTextField.text { 108 109 //であれば、cell(PostTableViewCell)のtextFieldをプリントする 110 print(self.commentTextField.text as Any) 111 112 //であれば、postData.commentsにcommentTextをappend(追加)する 113 postData.comments.append("(commentText)\n") 114 } 115 116 // 増えたcommentsをFirebaseに保存する 117 let postRef = Database.database().reference().child(Const.PostPath).child(postData.id!) 118 //comments辞書 119 let commentDictionary = ["comments": postData.comments] 120 //Firebaseに辞書を保存する 121 postRef.updateChildValues(commentDictionary) 122 } 123}

コメントテーブルビューのカスタムセル

swift5

1import UIKit 2 3class CommentTableViewCell: UITableViewCell { 4 5 @IBOutlet weak var commentLabel: UILabel! 6 @IBOutlet weak var goodButton: UIButton! 7 @IBOutlet weak var countLabel: UILabel! 8 9 override func awakeFromNib() { 10 super.awakeFromNib() 11 } 12 13 override func setSelected(_ selected: Bool, animated: Bool) { 14 super.setSelected(selected, animated: animated) 15 16 } 17}

試したこと

おそらくはviewDidLoadかviewWillAppearに.childAddedイベントや.childChangedイベントやらでリロードをかけるような気がしますが、
Firebaseのドキュメントを見ながらやってもうまく行きません。

補足情報(FW/ツールのバージョンなど)

Xcode11.3
Swift5
macOSMojave10.14.6

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

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

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

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

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

guest

回答1

0

ベストアンサー

Firebaseに関しては門外漢で恐縮なのですが、代替案として参考になれば。
SwiftにはTableViewを再描画するreloadData関数がありますので、それを利用してはどうでしょうか。
ArticleViewControllerクラスのcommentButton関数の末尾でcommentTableView.reloadData()を実行すると良いと思います。

投稿2020/01/18 16:10

suhi

総合スコア28

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

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

iOS25535009

2020/01/18 16:16

ありがとうございます。反映できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問