#ios #swift #uitableview #tableview #nsuserdefaults
#iOS #swift #uitableview #tableview #nsuserdefaults
Вопрос:
У меня есть tableview, и я хотел бы, чтобы пользователь мог перемещать ячейки в любом порядке, в котором они хотели бы. Ячейки — это объекты, которые извлекаются из базы данных в серверной части, поэтому, когда пользователь перезагружает или закрывает приложение, порядок, в котором они изменили ячейки, не сохраняется, и он продолжает захватывать тот же порядок, в котором они были добавлены в приложение. Я попытался сохранить это в UserDefaults, приложение вылетает с сообщением
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object (
"Myapp.Animal",
"Myapp.Animal",
"Myapp.Animal"
) for key sortedanimals'
Я понимаю, что не могу сохранить весь объект в UserDefaults, но я в замешательстве и не знаю, как я могу сохранить только порядок в UserDefaults.
Это функции tableview, в которых пользователь может перетаскивать ячейки в tableview:
func tableView(_ tableView: UITableView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] {
let dragItem = UIDragItem(itemProvider: NSItemProvider())
dragItem.localObject = allAnimals[indexPath.row]
return [ dragItem ]
}
func tableView(_ tableView: UITableView, moveRowAt indexPath: IndexPath, to: IndexPath) {
let mover = allAnimals.remove(at: indexPath.row)
allAnimals.insert(mover, at: to.row)
UserDefaults.standard.set(allAnimals, forKey:"sortedanimals") //this is where the app crashes,
}
func tableView(_ tableView: UITableView, performDropWith coordinator: UITableViewDropCoordinator) {
}
Мой внутренний код не указывает интерфейсу устанавливать ячейки в каком-либо определенном порядке, он просто по умолчанию использует их в порядке идентификатора (или порядке, в котором они были добавлены в приложение)
Я просмотрел stackoverflow, но не могу найти никаких вопросов, где они пытаются изменить порядок данных, поступающих из серверной части, только переупорядочивая данные, которые создаются внутри интерфейса. Возможно ли это вообще с помощью UserDefaults?
Редактировать:
Теперь я создал массив, в котором перечислены все идентификаторы объектов в том порядке, в котором они были реорганизованы. Однако я не знаю, как реорганизовать данные, полученные из серверной части, в том порядке, в котором я хотел бы, чтобы они были упорядочены. Это созданный мной массив. Нужно ли мне отправлять этот массив на серверную часть для реорганизации, или я должен сделать это во внешнем интерфейсе?
let ids = allAnimals.map { $0.id }
Комментарии:
1. Вы должны добавить индекс или уникальный идентификатор к модели. Затем сохраните это и отсортируйте элементы по индексу или uuid. Сохранение целых объектов, которые в любом случае повторно извлекаются, не имеет смысла
2. Вы говорите, что объекты имеют
id
. Предполагая, что это просто Int или строка, вы можете сохранить их массив в UserDefaults, а затем использовать его для сортировки данных, которые вы извлекаете из серверной части.3. Спасибо за ответы. Я создал массив каждого идентификатора объекта в том порядке, в котором они были реорганизованы. Каким будет мой следующий шаг к сортировке данных, которые я извлекаю из серверной части?