【问题标题】:Can you save an array of ViewControllers locally (NSKeyedArchiver) in swift?你能快速在本地保存一组 ViewController(NSKeyedArchiver)吗?
【发布时间】:2017-04-17 02:16:00
【问题描述】:

我目前受雇创建本地文档 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 和它在数组中的状态并在本地保存 that 数组? 我可能会实现“模型”的正确版本,但因为以前的开发人员开发了 10 多个视图控制器和一个模型,我相信很难为所有这些创建单独的模型,就像图像、语音记录和外部输入了注释...因此,如果有人知道任何方法可以在本地保存带有变量的 ViewController,请帮助我!

提前致谢,我已经努力保存好几个小时了..

【问题讨论】:

  • 不要认为尝试将整个 viewController 保存在磁盘中是一个好主意,而只是将其数据保存在磁盘中并稍后恢复,或者如果您想在启动时退出并恢复,请使用 preserving viewcontroller
  • @Tj3n 我知道保存整个 viewController 不是最好的主意。但是由于之前的开发人员没有创建多个模型来跟踪和保存应用程序的输入信息(名称、日期、图像、外部注释)。此外,他们创建的唯一模型文件是一个包含数组中的所有视图控制器(及其变量)。所以我不想干涉他们创建的任何功能,因为我无法理解他们的代码。
  • 那是严重的代码异味,我认为您的保存不起作用,因为视图控制器不会与NSCoding 对抗,如果您实现这一点,您将能够将其保存在@987654324 @ 或作为文件

标签: ios arrays swift uiviewcontroller nskeyedarchiver


【解决方案1】:

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

例子:

import UIKit

类类名: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")
}

}

【讨论】:

  • 这是有道理的!这就是我正在尝试的方式。但是,好像我无法与以前的开发人员交流,而且代码非常混乱,如果没有基本上从头开始重新启动整个项目,我不可能有效地做到这一点这在我的时间跨度内是不可能的。如果您知道任何保存视图控制器及其变量(文本字段等)的方法,请告诉我! :) 否则,我会看看我能做什么
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 2015-11-24
    • 1970-01-01
    • 2013-05-15
    • 2015-12-03
    • 2015-11-16
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    相关资源
    最近更新 更多