2017-07-08 80 views
0

我剛開始學習Swift,所以這個問題的級別可能對你來說足夠明顯,但是,我根本無法理解該怎麼做。userdefaults用法問題swift 3

我「創建」了一個簡單的應用程序,允許您添加日期的日誌。每個單元格存儲您添加的時間,根據時間改變的自定義圖標以及日誌文本本身(簡單文本)。

一切工作正常。但是,因爲我不知道「Userdefaults」的內容,所以每當我殺死該應用程序時,時鐘就會重置。

我讀了很多關於Userdefaults的文章,但我不知道如何保存我的數據,即使我殺了應用程序。

這裏就是我試圖做的:

class ToDoItem: NSObject, NSCoding { 


var title: String 
var date: String 
var type: String! 

public init(title: String, date: String, type: String) { 

    self.title = title 
    self.date = date 
    self.type = type 

} 

required init?(coder aDecoder: NSCoder) 
{ 
    // Try to unserialize the "title" variable 
    if let title = aDecoder.decodeObject(forKey: "title") as? String 
    { 
     self.title = title 
     let dateFormatter = DateFormatter() 
     dateFormatter.dateStyle = .none 
     dateFormatter.timeStyle = .short 
     self.date = dateFormatter.string(from: Date()) 

     let hour = NSCalendar.current.component(.hour, from: Date()) 
     var tempType = "" 
     switch hour { 
     case 5..<9: tempType = "morning_1" 
     case 6..<12: tempType = "morning_2" 
     case 12: tempType = "noon_1" 
     case 13..<16: tempType = "afternoon_1" 
     case 16..<20: tempType = "dusk_1" 
     case 20..<23: tempType = "evening_1" 
     case 23..<00: tempType = "midnight_1" 
     default: tempType = "morning_1" 


     } 

     self.type = tempType 

    } 



    else 
    { 
     // There were no objects encoded with the key "title", 
     // so that's an error. 
     return nil 
    } 

    let userDefaults = UserDefaults.standard 
    userDefaults.set(true, forKey: "title") 

} 

func encode(with aCoder: NSCoder) 
{ 
    // Store the objects into the coder object 
    aCoder.encode(self.title, forKey: "title") 

    let defaults = UserDefaults.standard 
    defaults.set(false, forKey: "title") 


} 

}

extension Collection where Iterator.Element == ToDoItem 
{ 
    // Builds the persistence URL. This is a location inside 
    // the "Application Support" directory for the App. 
    private static func persistencePath() -> URL? 
    { 
     let url = try? FileManager.default.url(
      for: .applicationSupportDirectory, 
      in: .userDomainMask, 
      appropriateFor: nil, 
      create: true) 

     return url?.appendingPathComponent("todoitems.bin") 
    } 

    // Write the array to persistence 
    func writeToPersistence() throws 
    { 
     if let url = Self.persistencePath(), let array = self as? NSArray 
     { 
      let data = NSKeyedArchiver.archivedData(withRootObject: array) 
      try data.write(to: url) 
     } 
     else 
     { 
      throw NSError(domain: "com.example.MyToDo", code: 10, userInfo: nil) 
     } 
    } 

    // Read the array from persistence 
    static func readFromPersistence() throws -> [ToDoItem] 
    { 
     if let url = persistencePath(), let data = (try Data(contentsOf: url) as Data?) 
     { 
      if let array = NSKeyedUnarchiver.unarchiveObject(with: data) as? [ToDoItem] 
      { 
       return array 
      } 
      else 
      { 
       throw NSError(domain: "com.example.MyToDo", code: 11, userInfo: nil) 
      } 
     } 
     else 
     { 
      throw NSError(domain: "com.example.MyToDo", code: 12, userInfo: nil) 
     } 
    } 
} 

誰能幫助我,或至少點什麼,我有什麼關係?謝謝!

+0

怎麼樣一個簡單的[谷歌搜索](https://www.google.com/search?q=user+defaults+swift)? – deadbeef

+0

正如我告訴你的那樣。我不明白如何處理代碼。有用的意見是值得歡迎的! :-) –

+0

...或[Stackoverflow搜索](https://stackoverflow.com/search?q=nsuserdefaults)?順便說一句,'readFrom-'/'writeToPersistence'函數做了什麼? – vadian

回答

2

您使用的是NSKeyedArchiverNSKeyedUnarchiver,這是與UserDefaults不同的機制。兩者都是完全有效的,但你必須選擇一個,但它們不能一起工作。

在這裏,您正在對ToDoItem的數組進行歸檔和解除歸檔。對於這項工作,ToDoItem需要被存檔,這意味着它必須實現NSCoding協議,它是:

public protocol NSCoding { 
    public func encode(with aCoder: NSCoder) 
    public init?(coder aDecoder: NSCoder) // NS_DESIGNATED_INITIALIZER 
} 

所有你想要保存的屬性必須添加到/從NSCoder對象提取。這裏是一個例子:

class ToDoItem: NSObject, NSCoding 
{ 
    var title: String 
    var date: Date 

    required init?(coder aDecoder: NSCoder) 
    { 
     guard let title = aDecoder.decodeObject(forKey: "title") as? String else { 
      return nil 
     } 
     guard let date = aDecoder.decodeObject(forKey: "date") as? Date else { 
      return nil 
     } 
     self.title = title 
     self.date = date 
    } 

    func encode(with aCoder: NSCoder) 
    { 
     aCoder.encode(self.title, forKey: "title") 
     aCoder.encode(self.date, forKey: "date") 
    } 
}