Realmで保存しているデータのBool値を表示しているセルをlikeしているかで表示の切り分けをしたいです。
cellForItemAtでisHiddenをしたら、表示しないというより、中身を写していないだけで、Trueのだけは表示されます。
cellForItemAtでリロードデータをし、表示するセルだけを更新しようとしたら逆に処理が止まってしまいました。
didLike == true のセルだけを表示したいのですが、セルを隠すにはisHiddenプロパティ以外にあるのでしょうか?
どなたかセルを非表示にする方法をご存知の方がおりましたら教えてくださると幸いです。
保存するクラスのデータ
class Tweet: Object { @objc dynamic var tweetId: Int = 0 @objc dynamic var didLike = false override static func primaryKey() -> String? { return "tweetId" } } class ReplyTweet: Object { @objc dynamic var replyTweetId: Int = 0 @objc dynamic var didLike = false override static func primaryKey() -> String? { return "replyTweetId" } }
VC
class ProfileController: UICollectionViewController, TimeStampRepository { let currentUser = CurrentUser.shared private let reuseIdentifier = "TweetCell" private let headerIdentifier = "ProfileHeader" private var user: Results<User>! private var tweets: [Tweet] = [Tweet]() { didSet { collectionView.reloadData() } } private var replyTweet = [ReplyTweet]() private var selectedFilter: ProfileFilterOptions = .tweets { didSet { collectionView.reloadData() } } init(user: Results<User>!) { self.user = user super.init(collectionViewLayout: UICollectionViewFlowLayout()) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func viewDidLoad() { super.viewDidLoad() configureCollectionView() tweets = Array(currentUser.user.tweets) replyTweet = Array(currentUser.user.replyTweet) } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) collectionView.reloadData() } private func configureCollectionView(){ collectionView.register(TweetCell.self, forCellWithReuseIdentifier: reuseIdentifier) collectionView.register(ProfileHeader.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: headerIdentifier) } } extension ProfileController { override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { switch self.selectedFilter { case .tweets: return tweets.count case .replies: return replyTweet.count case .likes: return tweets.count + replyTweet.count } } override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! TweetCell cell.delegate = self switch self.selectedFilter { case .tweets: let tweetIndex = tweets[indexPath.row] cell.tweets = tweetIndex cell.isHidden = false if tweetIndex.didLike == false { cell.likeButton.tintColor = .lightGray cell.likeButton.setImage(UIImage(named: "like_unselected"), for: .normal) } else { cell.likeButton.tintColor = .red cell.likeButton.setImage(UIImage(named: "baseline_favorite_black_24pt_1x"), for: .normal) } case .replies: let replyTweetIndex = replyTweet[indexPath.row] cell.replyTweets = replyTweetIndex cell.isHidden = false if replyTweetIndex.didLike == false { cell.likeButton.tintColor = .lightGray cell.likeButton.setImage(UIImage(named: "like_unselected"), for: .normal) } else { cell.likeButton.tintColor = .red cell.likeButton.setImage(UIImage(named: "baseline_favorite_black_24pt_1x"), for: .normal) } case .likes: // ここで隠すとリロードデータしても消えない let resultTweetLikeCount = tweets.count if indexPath.row < resultTweetLikeCount { let resultTweetLikeIndex = tweets[indexPath.row] if resultTweetLikeIndex.didLike == true { cell.tweets = resultTweetLikeIndex cell.likeButton.tintColor = .red cell.likeButton.setImage(UIImage(named: "baseline_favorite_black_24pt_1x"), for: .normal) } else { cell.isHidden = true } } else { let minusTweet = indexPath.row - resultTweetLikeCount let resultReplyLikeIndex = replyTweet[minusTweet] if resultReplyLikeIndex.didLike == true { cell.replyTweets = resultReplyLikeIndex cell.likeButton.tintColor = .red cell.likeButton.setImage(UIImage(named: "baseline_favorite_black_24pt_1x"), for: .normal) } else { cell.isHidden = true } } } return cell } } extension ProfileController { override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: headerIdentifier, for: indexPath) as! ProfileHeader header.user = user header.delegate = self return header } } extension ProfileController: UICollectionViewDelegateFlowLayout { func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize { let height = calcSize(width: view.frame.width, text: currentUser.user.profileText!).height return CGSize(width: view.frame.width, height: height + 280) } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { switch selectedFilter { case .tweets: let height = calcSize(width: view.frame.width, text: tweets[indexPath.row].caption).height let imageContainerHeight: CGFloat = tweets[indexPath.row].imageURLs.isEmpty ? 0 : 160 return CGSize(width: view.frame.width, height: height + 100 + imageContainerHeight) case .replies: let height = calcSize(width: view.frame.width, text: replyTweet[indexPath.row].replyCaption).height let imageContainerHeight: CGFloat = replyTweet[indexPath.row].imageURLs.isEmpty ? 0 : 160 return CGSize(width: view.frame.width, height: height + 100 + imageContainerHeight) case .likes: let count = tweets.count if indexPath.row < count { let height = calcSize(width: view.frame.width, text: tweets[indexPath.row].caption).height let imageContainerHeight: CGFloat = tweets[indexPath.row].imageURLs.isEmpty ? 0 : 160 return CGSize(width: view.frame.width, height: height + 100 + imageContainerHeight) } else { let minusTweet = indexPath.row - count let height = calcSize(width: view.frame.width, text: replyTweet[minusTweet].replyCaption).height let imageContainerHeight: CGFloat = replyTweet[minusTweet].imageURLs.isEmpty ? 0 : 160 return CGSize(width: view.frame.width, height: height + 100 + imageContainerHeight) } } } }
表示したくないものを取り除いた配列を作れば良いのでは。
ただtweetsの中身を変えればいいのでは?
まとめてなら
private var resultTweetLike = Array(realm.objects(Tweet.self).filter("didLike == true"))
として分割できるのですが、これではすべて表示してしまうのでシングルトンを使い、
各ユーザーごとのデータを表示するようにしました。
class CurrentUser {
static let shared: CurrentUser = .init()
private init() {}
private(set) var user: User = .init()
func setUser(_ user: User) {
self.user = user
}
}
let currentUser = CurrentUser.shared
tweets = Array(currentUser.user.tweets)
最後に配列に各ユーザーに入っているデータを渡しているのですが、
Trueのものだけを抜き出すのはどうすれば実装できるでしょうか?
あなたの回答
tips
プレビュー