Swift:以编程方式对表行进行重新排序

时间:2018-09-26 15:41:24

标签: ios swift uitableview tableview

我有一个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,它将移至底部并在末尾再次进行处理。 / p>

2 个答案:

答案 0 :(得分:1)

您可以以编程方式从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)

答案 1 :(得分:0)

将代码包装在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()