2017-10-03 2 views
1

ich eine Tabellenansicht implementieren, die eine Liste von Dokumenten zeigtNeuordnen von Zeilen in Tableview würde zurückgesetzt auf Standard nach Daten zu aktualisieren

enter image description here

ich mit diesem Code auf Neuordnungs Feature implementieren

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() 
} 

Es funktioniert vollständig in der Neuordnung, aber das Problem ist, wenn ich die Anwendung schließe und es wieder zu starten (jede Zeitaktualisierungsdatenfunktion läuft), kommt Reihen zu ihren Standardplätzen zurück. während ich die Änderungen in der Neuordnung gespeichert haben muss.

Antwort

1

Das Umordnen in tableView ist nur für tableView spezifisch. Diese Neuordnung wirkt sich nicht auf die ursprüngliche Datenquelle aus. Sobald Sie die App schließen und die Methode zum erneuten Laden der Daten erneut ausführen, werden die Originaldaten aus dem Dokumentverzeichnis abgerufen. Sie müssen die Reihenfolge dieser ursprünglichen Datei ändern, wenn sich diese Reihenfolge in tableView ändert.

  1. Daten aus dem Dokumentenverzeichnis abrufen.

    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. erstellen Wörterbuch mit Schlüssel als Dokumentenverzeichnis Datei- oder Ordnernamen und Wert als Index.

    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. speichern in Benutzereinstellungen

    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. Sobald Benutzer neu anordnen, den Wert im Wörterbuch zu jeder URL entsprechend ändern.

    //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. Wenn Benutzer in App bekommen wieder Array verwalten nach diesem Wörterbuch Wert in NSUserDefaults gespeichert.

+0

Wirklich wirklich danke für Ihre Sorgfalt. Ich bin komplett neu und verwirrt was genau zu tun ist. Kann ich bitte mehr erklären? Wie kann ich etwas tun, um die Originaldaten aus dem Dokumentenverzeichnis neu zu ordnen? Wenn refresh Daten Funktion läuft dann sollte es keine Auswirkungen auf Liste –

+0

Ich denke, implizit ist es nicht möglich, Dokument Verzeichnis zu sortieren, aber Sie können eine andere Spalte zu Dateien Benennung hinzufügen - Index und wenn Benutzer ändern oder in tableview neu anordnen müssen Sie das gleiche im Index zu aktualisieren Säule. Dann sortieren Sie die Dateien und Sie erhalten das gewünschte Ergebnis. –

+0

ist es möglich, dass Sie meine Codes so bearbeiten, wie Sie es vorschlagen? oder kannst du mir eine Schritt für Schritt Anleitung empfehlen? Vielen Dank. schätzen –

Verwandte Themen