質問編集履歴

1

解決いたしましたので削除します。

2021/04/07 01:06

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,445 +1,3 @@
1
1
  タイトル通り、Realmでライク機能を実装したいのですが、以下の不具合が解消されずに困っています。
2
2
 
3
3
  ・ **画面遷移を行うと、勝手にlikeボタンの色が変わったり、他のセルのlikeボタンの色もタッチしていないのに変わる**
4
-
5
-
6
-
7
- こちらは本あぷりのモデルです。
8
-
9
- ```ここに言語を入力
10
-
11
- class Tweet: Object {
12
-
13
-
14
-
15
- @objc dynamic var tweetId: Int = 0
16
-
17
- @objc dynamic var caption: String = ""
18
-
19
- @objc dynamic var timestamp: Date = Date()
20
-
21
- @objc dynamic var retweetCount: Int = 0
22
-
23
- @objc dynamic var likes: Int = 0
24
-
25
- @objc dynamic var didLike = false
26
-
27
- @objc dynamic var replyingTo: String?
28
-
29
- @objc dynamic var isReply: Bool { return replyingTo != nil }
30
-
31
-
32
-
33
- // Userオブジェクトを取得する
34
-
35
- let users = LinkingObjects(fromType: User.self, property: "tweets")
36
-
37
-
38
-
39
- override static func primaryKey() -> String? {
40
-
41
- return "tweetId"
42
-
43
- }
44
-
45
-
46
-
47
- }
48
-
49
- ```
50
-
51
-
52
-
53
- そしてこのVCの関数 **handleLikeTapped(_ cell: TweetCell)**が問題があります。
54
-
55
- この関数はカスタムセル(TweetCell)のボタン(likeButton)をタップすると、色が変え、ライクした回数を数えます。
56
-
57
- falseだと、回数をマイナスし、trueだとプラスします。
58
-
59
- しかし、ここでおかしな問題が生じます。
60
-
61
- ボタンが二回押さないと赤にならず、またfalseだと.lightgrayになるのですが、falseだとtrueになってしまい、そのまたtrueだとfalseにという矛盾が生じてしまっています。そして、アプリを終了し、また起動してみると、勝手に色が変わり、タッチしていないセルのボタンの色も変わり、trueになっていないにもかかわらずもです。
62
-
63
- もはや意味が分からないので、どなたか対処方法を教えてくださると幸いです。
64
-
65
- ```ここに言語を入力
66
-
67
- import UIKit
68
-
69
- import RealmSwift
70
-
71
- import ActiveLabel
72
-
73
-
74
-
75
- private let reuseIdentifier = "TweetCell"
76
-
77
- private let headeerIdentifier = "TweetHeader"
78
-
79
- private let realm = try! Realm()
80
-
81
- private let userObject = Array(realm.objects(User.self))
82
-
83
- private let tweetObject = Array(realm.objects(Tweet.self))
84
-
85
-
86
-
87
- class FeedController: UICollectionViewController {
88
-
89
-
90
-
91
- private var profileImage: UIImage?
92
-
93
- var viewControllers: [UIViewController] = []
94
-
95
- public var user: Results<User>! {
96
-
97
- didSet {
98
-
99
- guard let nav = viewControllers[0] as? UINavigationController else { return }
100
-
101
- guard let feed = nav.viewControllers.first as? FeedController else { return }
102
-
103
- feed.user = user
104
-
105
- configureLeftBarButton()
106
-
107
- }
108
-
109
- }
110
-
111
-
112
-
113
- private var tweets: [Tweet] = [Tweet]() {
114
-
115
- didSet { collectionView.reloadData() }
116
-
117
- }
118
-
119
-
120
-
121
- let actionButton: UIButton = {
122
-
123
- let button = UIButton(type: .system)
124
-
125
- button.tintColor = .white
126
-
127
- button.backgroundColor = .twitterBlue
128
-
129
- button.setImage(UIImage(named: "baseline_playlist_add_white_36pt_1x"), for: .normal)
130
-
131
- button.addTarget(self, action: #selector(actionButtonTapped), for: .touchUpInside)
132
-
133
- return button
134
-
135
- }()
136
-
137
-
138
-
139
- //MARK: - LifeCycle
140
-
141
-
142
-
143
- override func viewDidLoad() {
144
-
145
- super.viewDidLoad()
146
-
147
- view.backgroundColor = .white
148
-
149
- self.setRealm()
150
-
151
- }
152
-
153
-
154
-
155
- public func setRealm(){
156
-
157
- tweets = Array(realm.objects(Tweet.self))
158
-
159
- collectionView.reloadData()
160
-
161
- }
162
-
163
-
164
-
165
- }
166
-
167
-
168
-
169
- // MARK: - UICollectionViewDelegate/DataSource
170
-
171
-
172
-
173
- extension FeedController {
174
-
175
-
176
-
177
- override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
178
-
179
- return tweets.count
180
-
181
- }
182
-
183
-
184
-
185
- override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
186
-
187
- let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! TweetCell
188
-
189
- cell.delegate = self
190
-
191
- let tweetObject = tweets[indexPath.row]
192
-
193
- cell.tweets = tweetObject
194
-
195
- cell.captionLabel.text = tweetObject.caption
196
-
197
- cell.infoLabel.attributedText = title
198
-
199
- return cell
200
-
201
- }
202
-
203
-
204
-
205
- override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
206
-
207
- let controller = TweetController(tweets: [tweets[indexPath.row]])
208
-
209
- navigationController?.pushViewController(controller, animated: true)
210
-
211
- }
212
-
213
-
214
-
215
- }
216
-
217
-
218
-
219
- // MARK: - TweetCellDelegate
220
-
221
-
222
-
223
- extension FeedController: TweetCellDelegate {
224
-
225
-
226
-
227
- // 問題の関数
228
-
229
- func handleLikeTapped(_ cell: TweetCell) {
230
-
231
- let indexPath = self.collectionView.indexPath(for: cell)
232
-
233
- let tweetObject = tweets[indexPath!.row]
234
-
235
- try! realm.write {
236
-
237
- tweetObject.didLike.toggle()
238
-
239
- if tweetObject.didLike {
240
-
241
- cell.likeButton.tintColor = .lightGray
242
-
243
- cell.likeButton.setImage(UIImage(named: "like_unselected"), for: .normal)
244
-
245
- tweetObject.likes -= 1
246
-
247
- realm.add(tweetObject, update: .all)
248
-
249
- } else {
250
-
251
- cell.likeButton.tintColor = .red
252
-
253
- cell.likeButton.setImage(UIImage(named: "baseline_favorite_black_24pt_1x"), for: .normal)
254
-
255
- tweetObject.likes += 1
256
-
257
- realm.add(tweetObject, update: .all)
258
-
259
- }
260
-
261
- }
262
-
263
- }
264
-
265
- }
266
-
267
-
268
-
269
- public extension UIImage {
270
-
271
- func toPNGData() -> Data {
272
-
273
- guard let data = self.pngData() else {
274
-
275
- print("イメージをPNGデータに変換できませんでした。")
276
-
277
- return Data()
278
-
279
- }
280
-
281
- return data as Data
282
-
283
- }
284
-
285
-
286
-
287
- func toJPEGData() -> Data {
288
-
289
- guard let data = self.jpegData(compressionQuality: 1.0) else {
290
-
291
- print("イメージをJPEGデータに変換できませんでした。")
292
-
293
- return Data()
294
-
295
- }
296
-
297
- return data as Data
298
-
299
- }
300
-
301
-
302
-
303
- }
304
-
305
-
306
-
307
- ```
308
-
309
-
310
-
311
- * こちらがカスタムセル です。
312
-
313
- ```ここに言語を入力
314
-
315
- import UIKit
316
-
317
- import RealmSwift
318
-
319
- import ActiveLabel
320
-
321
-
322
-
323
- protocol TweetCellDelegate: class {
324
-
325
- func handleProfileImageTapped(_ cell: TweetCell)
326
-
327
- func handleReplyTapped(_ cell: TweetCell)
328
-
329
- func handleLikeTapped(_ cell: TweetCell)
330
-
331
- func deleteActionSheet(_ cell: TweetCell)
332
-
333
- }
334
-
335
-
336
-
337
- private let realm = try! Realm()
338
-
339
- private let userObject = Array(realm.objects(User.self))
340
-
341
- private let tweetObject = Array(realm.objects(Tweet.self))
342
-
343
-
344
-
345
- class TweetCell: UICollectionViewCell {
346
-
347
-
348
-
349
- // MARK: - Properties
350
-
351
-
352
-
353
- var tweets: Tweet = Tweet() {
354
-
355
- didSet { configure() }
356
-
357
- }
358
-
359
-
360
-
361
- private var user: Results<User>!
362
-
363
-
364
-
365
- weak var delegate: TweetCellDelegate?
366
-
367
-
368
-
369
-
370
-
371
- public lazy var likeButton: UIButton = {
372
-
373
- let button = UIButton(type: .system)
374
-
375
- button.setImage(UIImage(named: "like_unselected"), for: .normal)
376
-
377
- // button.tintColor = .darkGray
378
-
379
- button.setDimensions(width: 20, height: 20)
380
-
381
- button.addTarget(self, action: #selector(handleLikeTapped), for: .touchUpInside)
382
-
383
- return button
384
-
385
- }()
386
-
387
-
388
-
389
- // MARK: - Selecter
390
-
391
-
392
-
393
- @objc func handleLikeTapped(){
394
-
395
- delegate?.handleLikeTapped(self)
396
-
397
- }
398
-
399
-
400
-
401
- // MARK: - Helper
402
-
403
-
404
-
405
- public func configure(){
406
-
407
- if userObject[0].profileImage != nil {
408
-
409
- self.profileImageView.image = UIImage(data: userObject[0].profileImage!)
410
-
411
- } else {
412
-
413
- profileImageView.image = UIImage(named: "placeholderImg")
414
-
415
- }
416
-
417
- }
418
-
419
-
420
-
421
- func createButton(withImageName imageName: String) -> UIButton {
422
-
423
- let button = UIButton(type: .system)
424
-
425
- button.setImage(UIImage(named: imageName), for: .normal)
426
-
427
- button.tintColor = .darkGray
428
-
429
- button.setDimensions(width: 20, height: 20)
430
-
431
- return button
432
-
433
- }
434
-
435
-
436
-
437
-
438
-
439
-
440
-
441
- }
442
-
443
-
444
-
445
- ```