2017-04-17 84 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

這使得感!這就是我試圖去解決這個問題..但是,看到好像我無法與之前的開發人員溝通,而且代碼非常混亂,我無法高效地完成這項工作,而無需從頭開始重新開始整個項目這在我的時間段內不會成爲可能。如果你知道任何保存視圖控制器和它的變量(文本字段等)的方式,那麼請讓我知道! :) 否則,我會看看我能做什麼 –

相關問題