Сортировка по значениям bool каждого объекта и отображение в представлении коллекции

#ios #swift #sorting

#iOS #swift #сортировка

Вопрос:

У меня есть UITableView , внутри которого я использую UICollectionView . Итак, у меня есть несколько представлений коллекции, где пользователь может прокручивать по горизонтали. Теперь в моем представлении каждой коллекции у меня есть некоторые данные для отображения. Но каждый объект cell содержит значение bool. Если значение bool равно false, то мне нужно показать, что заголовок объекта первым в представлении моей коллекции, за которым следует значение bool, является true.

Мой JSON выглядит следующим образом:

 first obj:({
     name =ruler1;
     com = "        1";
     Dele = "";
     isTrue = false
 },
 {
     name =rule2r;
     com = "        1";
     Dele = "";
     isTrue = true
 },
 {
     name =rule3r;
     com = "        1";
     Dele = "";
     isTrue = false
 })

 sec obj:({
     name =ruler name1;
     com = "        1";
     Dele = "";
     isTrue = true
 },
 {
     name =ruler name 2;
     com = "        1";
     Dele = "";
     isTrue = false
 },
 {
     name =ruler name 3;
     com = "        1";
     Dele = "";
     isTrue = false
 })
  

В cellForRowAtIndexPath я просто показываю метку как обычную, например :

 collectionCell.cellTitleLabel.text = Info["name"] as? String ?? ""
  

Но как я могу отсортировать и показать, какой из объектов является false? Это нужно сначала показать.

Например:

ruler1 (false), rule3r(false) , rule2r(true) вроде то же самое.

Есть ли какое-либо полезное решение? Я пробовал с сортировкой, но мне это не сильно помогло.

Обновить:

У меня есть следующий код для отображения метки в методе collectionView at cellForRowAtIndexPath :

 if let gamesList = skillInfo?["data_list"]  as? [[String: Any]] {
    let gameInfo = gamesList[indexPath.item]
    collectionCell.cellTitleLabel.text = gameInfo["name"] as? String ?? ""
}
  

skillInfo это мой JSON список, который я добавил в свой пакет.

Комментарии:

1. Использование словарей сделает это болезненным. Пожалуйста, сначала разделите данные на объекты.

Ответ №1:

Вы можете сортировать по шагу просмотра:

  1. Установите массив JSON в объектную модель

  2. Затем используйте эту функцию для сортировки массива

например. ваш массив данных : arrData

затем вы используете:

 arrData.sort { (first, second) -> Bool in

return !first. isTrue

 }
  

это сортирует объект false value на первом месте

Комментарии:

1. я не использую какой-либо класс модели.. Из bundle json я извлекаю все данные и показываю

2. @david пожалуйста, используйте класс model

3. это немного существующий проект, не могу использовать модель между ними и для создания… есть решение без модели?

Ответ №2:

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

 let sortedArray = (myArray as NSArray).sortedArray(using: [NSSortDescriptor(key: "isTrue", ascending: false)]) as! [[String:AnyObject]]
  

Если вы хотите сначала получить истинное значение, то ascending = false и если вы хотите сначала получить значение false, то передайте ascending = true

Смотрите, как на этом скриншоте отсортирован выходной массив словаря.

введите описание изображения здесь

Комментарии:

1. Я получаю ошибку, подобную String is not convertiable to string? в моем key: "isTrue"

2. вы пытаетесь преобразовать в строку? смотрите мой скриншот вывода, ваш массив такой же или другой?

3. я обновил свой пост. пожалуйста, взгляните. Я использую файл json, который находится в моем пакете

Ответ №3:

Это для сортировки массива словаря.

Если бы значение по возрастанию = true сначала возвращало данные с isTrue = 0,

при возрастании = false сначала будут возвращены данные с isTrue = 1.

Вы можете удовлетворить свои потребности с помощью следующей строки, попробуйте этот код и дайте мне знать, если у вас все еще есть какие-либо проблемы.

  func sortJSONArray() {

    let bundle = Bundle.init(for: StackOverflowViewController.self)

    guard let jsonPath = bundle.path(forResource: "StackOVerflow", ofType: "json"),
        let jsonData = try? Data(contentsOf: URL(fileURLWithPath: jsonPath)) else {
            return
    }

    if let jsonObjects = (try? JSONSerialization.jsonObject(with: jsonData, options: JSONSerialization
        .ReadingOptions.allowFragments)) as? NSArray {

        let arrFiltered = jsonObjects.filter{($0 as! [String: Any])["isTrue"] as? Int == 0}
        let arrSorted = jsonObjects.sortedArray(using: [NSSortDescriptor(key: "isTrue", ascending: true)]) as! [[String:AnyObject]]

        print(arrFiltered)
        print(arrSorted)
    }
}
  

Это для фильтрации массива словаря (если вы хотите отображать только данные, которые имеют значение isTrue = 0)

 let arrFiltered = jsonObjects.filter{($0 as! [String: Any])["status"] as? Int == 0}
  

Комментарии:

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