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

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

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

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Swift

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

Q&A

0回答

988閲覧

セルをBool値で非表示にしたい

nyamagoyaki

総合スコア4

Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

Swift

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

0グッド

0クリップ

投稿2021/04/18 13:47

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) } } } }

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

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

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

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

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

hoshi-takanori

2021/04/18 15:06

表示したくないものを取り除いた配列を作れば良いのでは。
tomato879241

2021/04/19 04:39

ただtweetsの中身を変えればいいのでは?
nyamagoyaki

2021/04/19 12:06

まとめてなら 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のものだけを抜き出すのはどうすれば実装できるでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問