2017-05-08 14 views
3

我利用UserDefaults保存,偶爾需要被寫入到一個很小的值。我相信我已經設置正確,但我不知道爲什麼它在我退出模擬器並重新開始備份後無法工作。 的設置:儘管同步,Userdefaults值不會持續嗎?

let defaults = UserDefaults.standard 

它然後寫入/修改如下:

defaults.set(true, forKey: "defaultsChecker") 
defaults.synchronize() 

使用打印語句,我可以看到,價值確實被零至爲真更新。然而,在再次打開模擬器(被退出後)開始檢查在viewDidLoad值如下:

print("The value is is \((defaults.value(forKey: "defaultsChecker") as! Bool)))") 

這總是在一開始返回零,這意味着它不能被保存/通過持續關閉並重新打開模擬器。不知道爲什麼會這樣。

+0

你肯定在你重置關鍵「defaultsChecker」值的代碼沒有在哪裏? – Priyal

+1

假設你已經檢查了鍵(「defaultsChecker」)的拼寫,你應該在整個項目搜索「defaultsChecker」,以確保它沒有被設置爲'任何地方FALSE'。順便說一句,我建議要聲明一個常量與「defaultsChecker」的值,並把它作爲一個重點來避免打字錯的錯誤,當你需要使用它... –

+7

不要使用'值(forKey :) '從'UserDefaults'中讀取一個值,除非你明確需要使用鍵值編碼。你使用'bool(forKey :))'設置一個'Bool'來讀一個'Bool'。 – rmaddy

回答

2

不使用value(forKey:)讀bool值從UserDefaults 您在設置bool的再UserDefaults

enter image description here

,並使用bool(forKey:)

let defaults = UserDefaults.standard 
defaults.set(true, forKey: "defaultsChecker") 
print("The value is is \(defaults.bool(forKey: "defaultsChecker"))") 

這裏顯示多種類型的值想要得到的值,那麼試試這個

defaults.integer(forKey:) 
defaults.string(forKey:) 
defaults.double(forKey:) 
defaults.array(forKey:) 
defaults.dictionary(forKey:) 
defaults.data(forKey:) 
defaults.bool(forKey:) 

,也沒有必要使用synchronize()會自動同步。

在你的問題,你試試這個

...

if let defaultsChecker = UserDefaults.standard.object(forKey: "defaultsChecker") as? Bool { 
     if defaultsChecker { 
      debugPrint(defaultsChecker)// value has True 
     } else { 
      debugPrint(false)// value has False 
     } 
    } 
+0

我可以切換到'.bool(forKey:)',但問題是我首先要檢查它是否被寫入都還沒有,所以我需要檢查與if語句:'如果defaults.value(forKey: 「defaultsChecker」)!= nil {}'但我不能檢查它是否等於零,如果我使用'.bool'而不是'.value'。我如何解決這個問題? –

+0

@AkkPiasecki檢查我更新我的答案 – ItsMeMihir