2017-04-17 70 views
1

我目前被聘用来创建本地文档iOS应用程序的数据处理部分。我没有参与创建UserInterface,所以我需要帮助。你可以在本地保存一个ViewController数组(NSKeyedArchiver)吗?

问题: 创建该用户接口来实现所需的所有数据的人,只在视图控制器被保存,并且它们使用该模型来保存视图控制器的阵列。

我已经尝试使用FileManager和NSKeyedArchiver将此阵列本地保存到光盘上。我也尝试使用NSUserDefaults。他们没有在最初的应用程序中启用核心数据,而且该软件包有点混乱,这没有帮助。

下面是我在试图保存ViewControllers的数组DocumentPageModel.swift文件写的代码...

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本地变量的方式,请帮助我!提前

谢谢,我一直在使用NSCoding努力试图挽救这几个小时..

+0

不认为试图拯救整个的viewController磁盘是个好主意,而只是保存其数据在磁盘并在以后恢复,或用[保存视图 - 控制(https://开头开发商。 apple.com/library/content/featuredarticles/ViewControllerPGforiPhoneOS/PreservingandRestoringState.html)如果你想退出并继续发布 – Tj3n

+0

@ Tj3n我明白,保存整个viewController不是最好的主意。但由于之前的开发人员并未创建多个模型来跟踪并保持应用程序的输入信息(名称,日期,图像,外部注释)..而且,他们创建的唯一模型文件是一个将所有viewcontrollers(及其变量)保存在一个数组中的文件。所以我不想干涉他们创建的任何功能,因为我无法理解他们的代码。 –

+0

好吧,这是严重的代码味道,我认为你的保存不起作用,因为视图控制器不面对'NSCoding',如果你实现这个,你将能够将它保存在'NSUserDefault'或作为文件 – Tj3n

回答

0

您可以存储任何模型类对象NSUserDefaults的中。

例子:

import UIKit 

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

这使得感!这就是我试图去解决这个问题..但是,看到好像我无法与之前的开发人员沟通,而且代码非常混乱,我无法高效地完成这项工作,而无需从头开始重新开始整个项目这在我的时间段内不会成为可能。如果你知道任何保存视图控制器和它的变量(文本字段等)的方式,那么请让我知道! :) 否则,我会看看我能做什么 –

相关问题