你能在swift中本地保存一组ViewControllers(NSKeyedArchiver)吗?

时间:2017-04-17 02:16:00

标签: ios arrays swift uiviewcontroller nskeyedarchiver

我目前受聘创建本地文档iOS应用程序的数据处理部分。我没有参与创建UserInterface,所以我需要帮助。

问题: 创建用户界面的人员实现了仅在视图控制器中保存所需的所有数据,并且他们使用该模型来保存视图控制器阵列。

我尝试使用FileManager和NSKeyedArchiver将此数组本地保存到光盘上。我也尝试过使用NSUserDefaults。他们也没有在初始应用程序中启用核心数据,而且程序包有点乱,但没有帮助。

下面是我在DocumentPageModel.swift文件中编写的代码,该文件试图保存一组ViewControllers ......

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
     }
     */
}

这样可以很好地保存数组。但是当调用retrieveData时,假定保存在ViewController中的变量/数据是'nil',抛出未捕获的异常。

问题: 有没有办法在一个数组中保存viewController 它的状态并在本地保存那个数组? 我可以实现'模型'的正确版本,但由于之前的开发人员开发了10多个视图控制器和一个模型,我相信很难为所有这些创建单独的模型,看起来好像是图像,录音和外部注释被输入...所以,如果有人知道任何方式可以在本地保存ViewController与它的变量,请帮助我!

先谢谢,我一直在努力保存这几个小时..

2 个答案:

答案 0 :(得分:0)

您可以使用NSCoding在NSUserDefaults中存储任何模型类对象。

示例:

import UIKit

class 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")
}

}

答案 1 :(得分:0)

我认为你应该使用App State Restoration来存储控制器的完整状态及其所有对象。试试这些教程 -

  

https://www.raywenderlich.com/117471/state-restoration-tutorial

     

http://useyourloaf.com/blog/state-preservation-and-restoration/