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 中的重新排序行将在数据刷新后重置为默认值的主要内容,如果未能解决你的问题,请参考以下文章

使用ajax刷新表格内容后重绘数据表?

从 tableView 中的 Firestore 单元格读取数据后随机重新排序

使用重新加载数据选择子项后,Tableview 刷新到父视图

像刷新一样重新加载tableview视图

如何在 swift 中使用 fetchedresultscontroller 重新排序 tableview 行?

iphone SDK:使用核心数据对任意 tableview 行重新排序