前提
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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/18 16:16