2017-04-17 4 views
1

Ich bin derzeit angestellt, um den Datenverarbeitungsteil einer lokalen Dokument-iOS-Anwendung zu erstellen. Ich war nicht am Erstellen des UserInterfaces beteiligt und brauche daher Hilfe.Können Sie ein Array von ViewControllern lokal (NSKeyedArchiver) in swift speichern?

Das Problem: Die Person (en), die die Benutzeroberfläche erstellt implementiert alle benötigten Daten nur im View-Controller gespeichert werden, und sie nutzen das Modell eine Reihe von View-Controller zu speichern.

Ich habe versucht, dieses Array lokal mit FileManager und NSKeyedArchiver auf der Disc zu speichern. Ich habe auch versucht, NSUserDefaults zu verwenden. Sie haben auch keine Kerndaten in der ersten Anwendung aktiviert und das Paket ist ein wenig chaotisch, was nicht hilft.

Unten ist der Code, den ich in der DocumentPageModel.swift Datei geschrieben, die eine Reihe von Viewcontrollers zu retten versucht ...

static let DocumentsDirectory = try! FileManager().url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true) 


//static let DocumentsDirectory = FileManager().urls(for: .documentDirectory, in: .userDomainMask).first! 
static let ArchiveURL = DocumentsDirectory.appendingPathComponent("meals") 

// Save the data onto drive (Called when the 'save' button is pressed on a create new case page 
public func saveData() { 
    NSKeyedArchiver.archiveRootObject(CasePageModel.cases, toFile: CasePageModel.ArchiveURL.path) 
    //listOfTasks = CasePageModel.cases 
    print("Successfully saved") 
} 


private var listOfTasks: [CaseViewController] { 
    get { 
     return (NSKeyedUnarchiver.unarchiveObject(withFile: CasePageModel.ArchiveURL.path) as? [CaseViewController])! // ??[] 
    } 
    set { 
     NSKeyedArchiver.archiveRootObject(CasePageModel.cases, toFile: CasePageModel.ArchiveURL.path) 
    } 
} 

// Retrieves data saved and makes it: var cases 
// Called when view is loaded. 
public func retrieveData() { 
    CasePageModel.cases = listOfTasks 
    print("Successfully loaded") 
    print("\(CasePageModel.cases.count)") 

    /* 
    if let arrayOfCases: NSArray = UserDefaults.object.(forKey: "cases") as! NSArray { 
    CasePageModel.cases = arrayOfCases 
    } 
    */ 
} 

Dieses feinen das Array speichert, aber wenn die retrieveData Aufruf, die Variablen/Daten Angeblich in einem ViewController gespeichert, wird 'nil' eine nicht abgefangene Ausnahme auslösen.

Frage: Gibt es eigentlich eine Möglichkeit, die Viewcontroller speichern und es ist Zustand innerhalb eines Arrays und speichern dass lokal Array? Ich könnte möglicherweise eine korrekte Version des 'Modells' implementieren, aber weil die früheren Entwickler 10 + View - Controller und ein Modell entwickelt haben, glaube ich, dass es schwierig sein wird, separate Modelle für alle von ihnen zu erstellen, als ob Bilder, Sprachaufzeichnungen und Externe Notizen werden eingegeben ... Wenn also jemand den ViewController mit seinen Variablen lokal speichern kann, bitte hilf mir !!

Vielen Dank im Voraus, ich habe zu versuchen, diese stundenlang gearbeitet ..

+0

Dont denken versuchen, ganze Viewcontroller in der Festplatte speichert eine gute Idee ist, sondern nur seine Daten in der Festplatte speichern und später wiederherstellen, oder [Erhaltung Viewcontroller] (https: // Entwickler. apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/PreservingandRestoringState.html) Wenn Sie beim Start beenden und fortsetzen möchten – Tj3n

+0

@ Tj3n Ich verstehe, dass das Speichern eines ganzen ViewController nicht die beste Idee ist. Aber da der vorherige Entwickler nicht mehrere Modelle erstellt hat, um die Eingabeinformationen der App zu behalten und zu behalten (Namen, Daten, Bilder, externe Notizen).Und außerdem, Die einzige Modelldatei, die sie erstellten, war eine Datei, die alle Viewcontroller (und ihre Variablen) in einem Array enthielt. Daher möchte ich mich nicht mit den Funktionen befassen, die sie erstellt haben, da ich ihren Code nicht verstehen kann. –

+0

Nun, das ist ernsthaft Code-Geruch, ich denke, Ihre Speicherung funktioniert nicht, da View-Controller nicht mit 'NSCoding konfrontiert wird, wenn Sie dies implementieren, können Sie es in' NSUserDefault' oder als Dateien – Tj3n

Antwort

0

Sie speichern Objekt jede Modellklasse in NSUserDefaults NSCoding verwenden, können zu speichern.

Beispiel:

import UIKit 

Klasse Classname: NSObject {

var customerID:Int! 

override init() {} 


required init(coder aDecoder: NSCoder) { 

    if let customerID = aDecoder.decodeObjectForKey("customerID") as? Int { 
     self.customerID = totalHoldingCost 
    } 


} 

func encodeWithCoder(aCoder: NSCoder) { 

    aCoder.encodeObject(customerID, forKey: "customerID") 
} 

}

+0

Dies macht Sinn! Dies ist, wie ich versuche, darüber zu gehen. Aber sehen, als ob ich den vorherigen Entwickler nicht kommunizieren kann, und der Code ist so chaotisch, Es ist nicht möglich für mich, dies effizient zu tun, ohne das gesamte Projekt von Grund auf neu zu starten Das wird in meiner Zeit nicht posisibel sein. Wenn Sie eine Möglichkeit zum Speichern eines View-Controllers und seiner Variablen (Textfelder usw.) kennen, dann lassen Sie es mich bitte wissen! :) Ansonsten werde ich sehen, was ich tun kann –

Verwandte Themen