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 中重新排序项目?
iOS - 在 Swift 3 中以编程方式删除和激活新约束时布局损坏