我目前受聘创建本地文档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与它的变量,请帮助我!
先谢谢,我一直在努力保存这几个小时..
答案 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/