Swift: программно переупорядочивайте строки таблицы

У меня есть TableViewController со строками, содержащими задачи. Если у задачи есть атрибут task.done = 1, я хочу переместить его в конец таблицы. Я не могу предоставить никакого кода, потому что не сомневаюсь, как это сделать.

Моя идея заключалась в tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) с использованием следующего кода:

let element = tasks.remove(at: indexPath.row)
tasks.insert(element, at: tasks.count)

Проблема в том, что это нужно сделать после загрузки таблицы, потому что, если первая строка - это, например, done = 1, она будет перемещена вниз и снова будет обработана в конце.

Возможный дубликат Swift - изменение порядка ячеек UITableView

koen 26.09.2018 17:44

Никогда не изменяйте модель данных или таблицу в cellForRowAt.

rmaddy 26.09.2018 17:56
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
1 995
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

tableView.moveRow(at: oldIndexPath, to: newIndexPath)

Если вы хотите удалить и вставить новые объекты в массив, вы можете попробовать метод, показанный ниже.

let element = tasks.remove(at: indexPath.row)
tableView.deleteRows(at: indexPath, with: .automatic)

tasks.insert(element, at: tasks.count)
tableView.insertRows(at: [IndexPath(row: tasks.count, section: 0)], with: .automatic)

Зачем вставлять и удалять? Используйте moveRow.

rmaddy 26.09.2018 17:55

Спасибо. Мне больше нравится moveRow. Где мне это делать? внутри viewDidLoad()?

PhilHarmonie 26.09.2018 18:03

В определение выполненной задачи добавьте блок didSet. Вызывается после того, как все готово.

E.Coms 26.09.2018 18:24

@rmaddy Согласен ..! Спасибо, что поправили меня. Обновил свой ответ.

Jay Mayu 26.09.2018 19:59

Оберните свой код в блок beginUpdates-endUpdates. Используйте func moveRow (в indexPath: IndexPath, в newIndexPath: IndexPath)

Например: не проверено

self.tableView.beginUpdates()
let element = tasks.remove(at: indexPath.row)
let  movingRowIndex = indexPath.row
tasks.insert(element, at: tasks.count)
let indexPath = NSIndexPath(forRow: movingRowIndex, inSection: 0)
var lastIndexPath = NSIndexPath(forRow:tasks.count, inSection: 0)
self.tableView.moveRow(at indexPath: IndexPath, to newIndexPath: lastIndexPath)
self.tableView.endUpdates()

Это не компилируется, и begin-/endUpdates бесполезен для одной операции.

vadian 26.09.2018 18:13

Разве это не должно быть в цикле for, который проверяет атрибут done?

PhilHarmonie 26.09.2018 18:18

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