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

Posted

技术标签:

【中文标题】Swift:以编程方式重新排序表行【英文标题】:Swift: Reorder Table Rows programmatically 【发布时间】:2018-09-26 15:41:23 【问题描述】:

我有一个包含任务的行的 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 - Reorder UITableView cells的可能重复 永远不要修改cellForRowAt中的数据模型或表。 【参考方案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)

【讨论】:

为什么要插入和删除?使用moveRow 谢谢。我更喜欢 moveRow。我在哪里做这个?在viewDidLoad()? 在您的任务完成定义中添加一个 didSet 块。在完成设置后调用。 @rmaddy 同意..!谢谢你纠正我。更新了我的答案。【参考方案2】:

将您的代码包装在 beginUpdates-endUpdates 块中。使用 func moveRow(at indexPath: IndexPath, to 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 对单个操作毫无意义。 这不需要在 for 循环中检查 done 属性吗?

以上是关于Swift:以编程方式重新排序表行的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式在 IOS 的 UIStackView 中重新排序项目?

根据行 ID 以任意顺序重新排序表行

如何以编程方式重新排序primefaces数据表中的列

iOS - 在 Swift 3 中以编程方式删除和激活新约束时布局损坏

在 SWIFT OS X 中以编程方式添加和删除 NSTextField

Swift:通过 TabBar 和导航控制器以编程方式从一个视图转换到另一个视图