Не удалось перезагрузить UICollectionView при нажатии кнопки

У меня есть одна кнопка переключения. Изначально он будет в выключенном состоянии. Поэтому, когда я включаю переключатель, мне нужно передать набор данных в представление коллекции. И когда он снова отключится, мне нужно передать набор данных в представление коллекции.

Итак, вот мой код:

@IBAction func cateSelTap(_ sender: Any) {

     isChecked = !isChecked
     if isChecked {
        self.subsetTheCategoryListForClientLogin(isCityLogin: false)
     }else {
        self.subsetTheCategoryListForClientLogin(isCityLogin: true)
     }
}

    func subsetTheCategoryListForClientLogin(isCityLogin: Bool) {
        let cityType = "city"
        print("LOG:CATE1 \(self.categoryarr)")
        var objectIds = [Int]()
        var subsetArray = NSMutableArray()
        for i in 0..<self.categoryarr.count {
            let type = (self.categoryarr.object(at:i) as AnyObject).value(forKey: "type") as! String
            if isCityLogin {
                if type == cityType {
                    subsetArray.add(self.categoryarr.object(at:i) as AnyObject)
                    objectIds.append(i)
                }
            } else {
                if type != cityType {
                    subsetArray.add(self.categoryarr.object(at:i) as AnyObject)
                    objectIds.append(i)
                }
            }
        }
        self.categoryarr.removeAllObjects()
        self.categoryarr = subsetArray
        print("LOG:CATE2 \(self.categoryarr)")
        DispatchQueue.main.async{
            self.categorycollection.reloadData()
//            self.categorycollection.performSelector(onMainThread: #selector(self.categorycollection.reloadData), with: nil, waitUntilDone: true)

        }
    }

Когда я запускаю свое приложение и когда я выключаюсь, мои данные представления коллекции не отображают точные данные ... тем не менее они показывают предыдущие данные. Опять же, когда я выключаю его полностью пустой.

Любая помощь в этом?

Похоже, вы вызываете subsetTheCategoryListForClientLogin: с одним и тем же параметром в обоих условиях действия кнопки. Также вы применяете фильтр к self.categoryarr и присваиваете результаты себе. Это причина того, что коллекция становится пустой после некоторого цикла включения/выключения.

Akhilrajtr 08.04.2019 11:38

да, я передаю ему значения bool. на основе этого логического значения только мои данные будут отправляться в колл-представление

drangon 08.04.2019 11:40

@Akhilrajtr да, потому что в моем представлении коллекции я использую categoryarr, чтобы показать значения в ячейке представления моей коллекции. Так что только я назначен на categoryarr. если это выключено, то логические значения будут ложными. И если это значение bool, то оно будет истинным. Я добавляю данные только на основе логического значения.

drangon 08.04.2019 11:44

Если вам нужно отфильтровать исходный массив с условием и отобразить отфильтрованные элементы в представлении коллекции, используйте другой массив в качестве источника представления коллекции и сохраните исходный источник данных как есть.

Akhilrajtr 08.04.2019 11:47
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
115
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

@IBAction func cateSelTap(_ sender: Any) {
      isChecked = !isChecked
   if isChecked {
         self.subsetTheCategoryListForClientLogin(isCityLogin: false)
   } else {
         self.subsetTheCategoryListForClientLogin(isCityLogin: true)
   }
}

то же самое в моем посте. Что еще добавлено??

drangon 08.04.2019 11:41

У вас было isCityLogin: false дважды; у этого есть false, то true. Если это решение, было бы неплохо указать на это.

Wai Ha Lee 08.04.2019 12:08

я поменял, то тоже безуспешно

drangon 09.04.2019 10:57
Ответ принят как подходящий

Добавьте новое свойство, например categoryarr, например categoryCollectionViewSource, и назначьте ему начальные данные. Используйте categoryCollectionViewSource в методах делегата представления коллекции вместо categoryarr. И в методе фильтра

func subsetTheCategoryListForClientLogin(isCityLogin: Bool) {

    let cityType = "city"
    print("LOG:CATE1 \(self.categoryarr)")
    var objectIds = [Int]()
    var subsetArray = NSMutableArray()
    for i in 0..<self.categoryarr.count {
        let type = (self.categoryarr.object(at:i) as AnyObject).value(forKey: "type") as! String
        if isCityLogin {
            if type == cityType {
                subsetArray.add(self.categoryarr.object(at:i) as AnyObject)
                objectIds.append(i)
            }
        } else {
            if type != cityType {
                subsetArray.add(self.categoryarr.object(at:i) as AnyObject)
                objectIds.append(i)
            }
        }
    }
    //note this line
    self.categoryCollectionViewSource.removeAllObjects()
    self.categoryCollectionViewSource = subsetArray
    print("LOG:CATE2 \(self.categoryarr)")
    DispatchQueue.main.async{
        self.categorycollection.reloadData()
    }
}
categoryCollectionViewSource какой тип собственности ??
drangon 08.04.2019 11:47

то же, что categoryarr собственность.

Akhilrajtr 08.04.2019 11:47

я пытался, но я получаю сбой, как в ячейке для диапазона индекса метода индекса [0.. 3] вот так

drangon 09.04.2019 11:06

возможно, вы все еще используете categoryarr в методах делегата/источника данных collectionview.

Akhilrajtr 09.04.2019 12:56

Я исправил это... не могли бы вы помочь мне здесь: stackoverflow.com/questions/55590016/….

drangon 09.04.2019 13:01

Другие вопросы по теме