TableView 中的重新排序行将在数据刷新后重置为默认值
Posted
技术标签:
【中文标题】TableView 中的重新排序行将在数据刷新后重置为默认值【英文标题】:Reordering rows in TableView would reset to default after data refresh 【发布时间】:2017-10-03 10:42:49 【问题描述】:我实现了一个表格视图,它显示了一个文档列表
我用这段代码实现了重新排序功能
var documents = [PDFDocument]()
override func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath)
let movedObject = self.documents[sourceIndexPath.row]
let fileManager = FileManager.default
documents.remove(at: sourceIndexPath.row)
documents.insert(movedObject, at: destinationIndexPath.row)
NSLog("%@", "\(sourceIndexPath.row) => \(destinationIndexPath.row) \(documents)")
do
let document = documents[sourceIndexPath.row]
let documentURL = document.documentURL?.absoluteString
let document_Dest = documents[destinationIndexPath.row]
let documentURL_Dest = document_Dest.documentURL?.absoluteString
try fileManager.moveItem(atPath: documentURL!, toPath: documentURL_Dest!)
catch let error as NSError
print("Ooops! Something went wrong: \(error)")
// To check for correctness enable: self.tableView.reloadData()
refreshData()
private func refreshData()
let fileManager = FileManager.default
let documentDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0]
let contents = try! fileManager.contentsOfDirectory(at: documentDirectory, includingPropertiesForKeys: nil, options: .skipsHiddenFiles)
documents = contents.flatMap PDFDocument(url: $0)
tableView.reloadData()
它在重新排序时完全正常,但问题是当我关闭应用程序并重新启动它时(任何时候刷新数据功能运行),行都会回到它们的默认位置。而我需要在重新排序时保存更改。
【问题讨论】:
【参考方案1】:tableView 中的重新排序仅特定于 tableView。这种重新排序不会影响原始数据源。关闭应用程序并再次运行重新加载数据的方法后,将从文档目录中获取原始数据。您需要在 tableView 中更改此顺序时更改此原始文件的顺序。
从文档目录中获取数据。
private func refreshData()
let fileManager = FileManager.default
let documentDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0]
let contents = try! fileManager.contentsOfDirectory(at: documentDirectory, includingPropertiesForKeys: nil, options: .skipsHiddenFiles)
documents = contents.flatMap PDFDocument(url: $0)
创建一个字典,键为文档目录文件或文件夹名称,值为索引。
private func refreshData()
let fileManager = FileManager.default
let documentDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0]
let contents = try! fileManager.contentsOfDirectory(at: documentDirectory, includingPropertiesForKeys: nil, options: .skipsHiddenFiles)
documents = contents.flatMap PDFDocument(url: $0)
let index = 0
let documentDic = NSMutableDictionary()
for element in documents
documentDic.setValue(index, forKey: element.documentURL?.absoluteString)
index = index + 1
将此保存在用户默认值中
private func refreshData()
let fileManager = FileManager.default
let documentDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask)[0]
let contents = try! fileManager.contentsOfDirectory(at: documentDirectory, includingPropertiesForKeys: nil, options: .skipsHiddenFiles)
documents = contents.flatMap PDFDocument(url: $0)
let index = 0
let documentDic = NSMutableDictionary()
for element in documents
documentDic.setValue(index, forKey: element.documentURL?.absoluteString)
index = index + 1
NSUserDefaults.standardUserDefaults().setObject(documentDic, forKey: "ReorderingFormat")
一旦用户重新排序,更改字典中与每个 url 对应的值。
//Read data from User Defaults
let dic = NSUserDefaults.standardUserDefaults().objectForKey("Reordering Format")
for element in documents
//This way you get the order or index number for any directory.
dic.objectForKey(element)
当用户再次进入应用程序时,根据存储在 nsuserdefaults 中的字典值管理您的数组。
【讨论】:
真的非常感谢您的关心。我是全新的,很困惑到底该怎么做。可以解释更多吗?我该如何做一些事情来重新排序文档目录中的原始数据?当刷新数据功能运行时,它不应该影响列表 我认为它不可能对文档目录进行排序,但您可以在文件命名中添加另一列 - 索引,当用户在 tableview 中更改或重新排序时,您需要在索引列中更新相同的列。然后对文件进行排序,您将获得所需的结果。 您可以按照您建议的方式编辑我的代码吗?或者你能推荐我一步一步的教程吗?非常感谢你。欣赏 非常感谢,它有一些错误,修复错误后刷新数据后它仍然重置为默认值,我的问题是我如何阅读userDefault
来显示表格?找了好久没找到确切的代码,请更新,万分感谢
@nedaDerakhshesh 我更新了读取用户默认值的代码,这是合乎逻辑的,因此您需要根据自己的要求进行编码。以上是关于TableView 中的重新排序行将在数据刷新后重置为默认值的主要内容,如果未能解决你的问题,请参考以下文章
从 tableView 中的 Firestore 单元格读取数据后随机重新排序
使用重新加载数据选择子项后,Tableview 刷新到父视图