【问题标题】:Reordering rows in TableView would reset to default after data refreshTableView 中的重新排序行将在数据刷新后重置为默认值
【发布时间】: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()
}

它在重新排序时完全正常,但问题是当我关闭应用程序并重新启动它时(任何时候刷新数据功能运行),行都会回到它们的默认位置。而我需要在重新排序时保存更改。

【问题讨论】:

    标签: ios swift uitableview file-manager


    【解决方案1】:

    tableView 中的重新排序仅特定于 tableView。这种重新排序不会影响原始数据源。关闭应用程序并再次运行重新加载数据的方法后,将从文档目录中获取原始数据。您需要在 tableView 中更改此顺序时更改此原始文件的顺序。

    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) }
      }
      
    2. 创建一个字典,键为文档目录文件或文件夹名称,值为索引。

      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
          }  
      
      }
      
    3. 将此保存在用户默认值中

      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")
      }
      
    4. 一旦用户重新排序,更改字典中与每个 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)
      }
      
    5. 当用户再次进入应用程序时,根据存储在 nsuserdefaults 中的字典值管理您的数组。

    【讨论】:

    • 真的非常感谢您的关心。我是全新的,很困惑到底该怎么做。可以解释更多吗?我该如何做一些事情来重新排序文档目录中的原始数据?当刷新数据功能运行时,它不应该影响列表
    • 我认为它不可能对文档目录进行排序,但您可以在文件命名中添加另一列 - 索引,当用户在 tableview 中更改或重新排序时,您需要在索引列中更新相同的列。然后对文件进行排序,您将获得所需的结果。
    • 您可以按照您建议的方式编辑我的代码吗?或者你能推荐我一步一步的教程吗?非常感谢你。欣赏
    • 非常感谢,它有一些错误,修复错误后刷新数据后它仍然重置为默认值,我的问题是我如何阅读userDefault来显示表格?找了好久没找到确切的代码,请更新,万分感谢
    • @nedaDerakhshesh 我更新了读取用户默认值的代码,这是合乎逻辑的,因此您需要根据自己的要求进行编码。
    猜你喜欢
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    相关资源
    最近更新 更多