teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

現在の追加コード

2018/06/04 13:57

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -119,4 +119,50 @@
119
119
 
120
120
  Xcode Version 9.3.1
121
121
 
122
- よろしくお願い致します。
122
+ よろしくお願い致します。
123
+
124
+
125
+ ### 追加コード
126
+
127
+ ```
128
+
129
+ override func viewWillDisappear(_ animated: Bool) {
130
+ let postData = photoInformation!
131
+
132
+ if let uid = Auth.auth().currentUser?.uid {
133
+ if buttonStatus != true {
134
+ print("DEBUG_PRINT: buttonStatusがtrueじゃなかったら")
135
+ // 変数indexにすでにいいねをしていた場合に-1をするために-1を初期化の時点で格納する
136
+ var index = -1
137
+ // for文でloopさせながらpostDataのlikesの中の値を取り出す
138
+ for likeID in postData.likes {
139
+ if likeID == uid {
140
+ print("DEBUG_PRINT: もし配列の中に自身のuidが存在していたら削除する")
141
+ index = postData.likes.index(of: likeID)!
142
+ postData.likes.remove(at: index)
143
+ break
144
+ } else {
145
+ print("DEBUG_PRINT: 配列の中に自身のuidが存在していなかったので何もしない") // ここの処理がうまくいかない
146
+ }
147
+ }
148
+
149
+ } else {
150
+ print("DEBUG_PRINT: buttonStatusがtrueだったら")
151
+ for likeID in postData.likes {
152
+ if likeID == uid {
153
+ print("DEBUG_PRINT: もしも既に配列の中にuidが存在していたら")
154
+ return
155
+ } else {
156
+ print("DEBUG_PRINT: 配列の中に自身のuidが存在しないので配列に追加する")
157
+ postData.likes.append(uid)
158
+ }
159
+ }
160
+ }
161
+ // 増えたlikesをFirebaseに保存する
162
+ // childメソッドでConst.PostPathを指定して、childメソッドで投稿情報のidを指定する
163
+ let postRef = Database.database().reference().child(Const.PostPath).child(postData.id!)
164
+ let likes = ["likes": postData.likes]
165
+ postRef.updateChildValues(likes)
166
+ }
167
+ }
168
+ ```

1

コードの記入

2018/06/04 13:57

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -6,7 +6,110 @@
6
6
  この遷移先の画面を普通のUIViewControllerで実装したところ、いいねボタンをタップした時にボタンをタップしたユーザーの情報が格納される配列に格納し、すでにタップずみなら配列から削除をしていたのですが、ボタンがタップされた時に画面が更新されないので2度3度いいねが出来てしまったりという様なバグが発生してしまいました。なのでUITableViewにUIを表示してボタンがタップされる度に `tableView.reloadData` で画面を更新すれば解決すると考えたのですが他にいい方法はありますでしょうか?
7
7
  またUITableViewを使用して表示をした方がいいという意見であれば、どの部分で画面遷移前の画面からデータを取得して遷移後の画面でデータを表示するかの部分を教えていただけるとありがたいです。
8
8
 
9
+ ### コード
9
10
 
11
+ ``` swift
12
+
13
+ import UIKit
14
+ import Firebase
15
+ import FirebaseAuth
16
+ import FirebaseDatabase
17
+
18
+ class SharePhotoUpViewController: UIViewController {
19
+
20
+ @IBOutlet weak var profielNameLabel: UILabel!
21
+ @IBOutlet weak var imageView: UIImageView!
22
+ @IBOutlet weak var fightButton: UIButton!
23
+ @IBOutlet weak var commentButton: UIButton!
24
+ @IBOutlet weak var dateLabel: UILabel!
25
+ @IBOutlet weak var moreCountLabel: UILabel!
26
+ @IBOutlet weak var captionTextView: UITextView!
27
+ // 変数photoInformationに前の画面でUICollectionViewでタップされた画像の情報を取得する
28
+ var photoInformation: PostData!
29
+ let formatter = DateFormatter()
30
+ var label = UILabel()
31
+
32
+
33
+ override func viewDidLoad() {
34
+ super.viewDidLoad()
35
+
36
+ label.font = UIFont.systemFont(ofSize: 20)
37
+ label.text = photoInformation?.name
38
+
39
+ imageView.image = photoInformation.image
40
+ profielNameLabel.text = photoInformation?.name
41
+ formatter.dateFormat = "yyyy/MM/dd HH:mm"
42
+ let dateString = formatter.string(from: photoInformation.date!)
43
+ dateLabel.text = dateString
44
+ captionTextView.text = "(label.text!) (photoInformation.caption!)"
45
+
46
+ if photoInformation.isLiked {
47
+ let buttonImage = UIImage(named: "FireWhite48.png")
48
+ self.fightButton.setImage(buttonImage, for: .normal)
49
+ } else {
50
+ let buttonImage = UIImage(named: "FireRed48.png")
51
+ self.fightButton.setImage(buttonImage, for: .normal)
52
+ }
53
+
54
+ // Do any additional setup after loading the view.
55
+ }
56
+
57
+ override func didReceiveMemoryWarning() {
58
+ super.didReceiveMemoryWarning()
59
+ // Dispose of any resources that can be recreated.
60
+ }
61
+
62
+ override func viewWillAppear(_ animated: Bool) {
63
+ self.reloadInputViews()
64
+ }
65
+
66
+
67
+ @IBAction func handleFightButton(_ sender: Any) {
68
+ print("DEBUG_PRINT: moreボタンがタップされました")
69
+ let postData = photoInformation!
70
+
71
+ // Firebaseに保存するデータの準備
72
+ if let uid = Auth.auth().currentUser?.uid {
73
+ if postData.isLiked { // isLikedには初期値でfalseが設定ずみ
74
+ // すでにfightをしていた場合はいいねを解除をするためにIDを削除する
75
+ // 変数indexにすでにいいねをしていた場合に-1をするために-1を初期化の時点で格納する
76
+ var index = -1
77
+ // for文でloopさせながらpostDataのlikesの中の値を取り出す
78
+ for likeID in postData.likes {
79
+ // もしlikesの中の値が格納されているlikeIDの中に現在ログインしているuidがあった場合
80
+ if likeID == uid {
81
+ index = postData.likes.index(of: likeID)!
82
+ break
83
+ }
84
+ }
85
+ postData.likes.remove(at: index)
86
+ } else {
87
+ // もしmoreをしていなかった場合、appendメソッドでlikesの配列の中に地震のuidを追加する
88
+ postData.likes.append(uid)
89
+ }
90
+ // 増えたlikesをFirebaseに保存する
91
+ // childメソッドでConst.PostPathを指定して、childメソッドで投稿情報のidを指定する
92
+ let postRef = Database.database().reference().child(Const.PostPath).child(postData.id!)
93
+ let likes = ["likes": postData.likes]
94
+ postRef.updateChildValues(likes)
95
+
96
+ }
97
+ }
98
+
99
+ override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
100
+ // もしコメントボタンをタップした時はshareButtonSegueで画面遷移をする
101
+ if segue.identifier == "shareButtonSegue" {
102
+ let shareCommentViewController: ShareCommentViewController = segue.destination as! ShareCommentViewController
103
+ print("DEBUG_PRINT: handleCommentActionがタップされました")
104
+ // 画面遷移時に表示されているデータをshareCommentViewControllerの変数に格納する
105
+ shareCommentViewController.photoInformation = photoInformation
106
+ }
107
+ }
108
+
109
+ }
110
+
111
+ ```
112
+
10
113
  ### 試したこと
11
114
 
12
115
  遷移先のUIViewControllerにUITableViewを配置し、UITableViewCellのxibファイルを作成し、 `register ` メソッドで呼び出し、 `ViewDidLoad` メソッドでxibファイルのインスタンスを使ってUI部品に値を格納したが全てのOutlet部品にnilが入ってしまいました。