Reputation: 37
I have a single image stored in UserDefaults
, but until a user sets it, UserDefaults
is empty. I need to check
If UserDefaults
is empty and if it is, display an image.
Right now on a fresh app install until a user sets an image into UserDefaults
, the app crashed.
My decode is working perfectly after I set an image in UserDefaults
, just the code checking for nil
is the problem.
I've only been learning swift for a month and I am stuck in this scenario.
here is my code:
//Image Decode
let Data = UserDefaults.standdard.object(forKey: "savedImage" as! NSData){
if (Data as Data?) != nil {
//display Image
dogImageView.image = UIImage(data: Data as Data)
}else {
dogImageView.image = Image Literal
}
}
Upvotes: 1
Views: 2473
Reputation: 4448
For swift 4.2, swift 5+
Write a class like:
import Foundation
public class PreferencesUtils {
private init() {
}
public static func setBoolData(boolValue: Bool, dataName: String) {
UserDefaults.standard.set(boolValue, forKey: dataName)
}
public static func getBoolData(dataName: String)-> Bool{
let defaults = UserDefaults.standard
if(defaults.value(forKey: dataName) != nil) {
return defaults.value(forKey: dataName)! as! Bool
} else {
return false
}
}
public static func saveStringData(data: String, dataName: String){
let preferences = UserDefaults.standard
preferences.set(data, forKey: dataName)
let didSave = preferences.synchronize()
if !didSave {
debugPrint("Not saved yet")
}
}
public static func getSavedStringData(dataName: String)-> String{
let defaults = UserDefaults.standard
if(defaults.value(forKey: dataName) != nil){
return defaults.value(forKey: dataName) as! String
} else {
return ""
}
}
public static func saveIntData(data : Int, dataName: String){
let preferences = UserDefaults.standard
preferences.set(data, forKey: dataName)
let didSave = preferences.synchronize()
if !didSave {
debugPrint("Not saved yet")
}
}
public static func getSavedIntData(dataName: String) -> Int {
let defaults = UserDefaults.standard
if(defaults.value(forKey: dataName) != nil){
return defaults.value(forKey: dataName) as! Int
}else{
return 0
}
}
}
Usage:
Save your data in preferences with line:
PreferencesUtils.saveStringData(data: "YOUR_DATA", dataName: "YOUR_KEY")
and for get this saved data :
PreferencesUtils.getSavedStringData(dataName: "YOUR_KEY")
Or check this library: Link
Upvotes: 1
Reputation: 5215
Use If-let to safaely unwrap optional.
if let data = UserDefaults.standard.data(forKey: "savedImage") { // image is present
dogImageView.image = UIImage(data: data)
} else { // image is not present. set a default image
dogImageView.image = Image Literal
}
Upvotes: 3