#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:
Вы можете сортировать по шагу просмотра:
-
Установите массив JSON в объектную модель
-
Затем используйте эту функцию для сортировки массива
например. ваш массив данных : 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, который есть в моем пакете. Не как массив или модуль. Как я могу выполнить сортировку с помощью моего обновленного кода в моем сообщении