Как получить и назначить объект NSDate из NSUserDefaults?
Я создаю приложение секундомера, и мне нужно сохранить дату начала, прежде чем пользователь закроет приложение, и ему нужно будет восстановить его, когда пользователь снова откроет приложение.
Так, например, если пользователь запускает секундомер, а затем закрывает приложение, а затем через некоторое время открывает приложение снова, приложение должно добавить время между открытием и закрытием до времени выполнения, если секундомер был запущен.
Я создал две функции в моем контроллере view, которые обрабатывают это. Здесь код:
override func viewWillAppear(animated: Bool)
{
let startTimedefault:NSUserDefaults = NSUserDefaults.standardUserDefaults()
let startTimesaved:NSDate = startTimedefault.objectForKey("start time") // This line is buggy
if(launchBool == true)
{
timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "fireStopWatch", userInfo: nil, repeats: true)
startTime = startTimesaved
}
if(launchBool == false)
{
timer.invalidate()
}
}
override func viewWillDisappear(animated: Bool)
{
NSUserDefaults.standardUserDefaults().setObject(launchBool, forKey: "Start/Stop")
NSUserDefaults.standardUserDefaults().setObject(startTime, forKey: "start time")
NSUserDefaults.standardUserDefaults().setObject(elapsedTime, forKey: "elapsed time")
}
Я прочитал пару сообщений здесь, в StackOverflow:
Каков оптимальный способ хранения NSDate в NSUserDefaults?
iOS - Не удалось сохранить NSDate в NSUserDefaults
Ответы
Ответ 1
Установите объект даты следующим образом:
UserDefaults.standard.set(Date(), forKey:"yourKey")
Получите его, используя:
UserDefaults.standard.object(forKey: "yourKey") as? Date
Дата будет необязательной, конечно, потому что она никогда не была установлена.
Ответ 2
Swift 3/4/5, используя Date
(введите псевдоним) вместо NSDate
:
let yourDate = UserDefaults.standard.object(forKey: "yourKey") as? Date
UserDefaults.standard.set(yourDate, forKey: "yourKey")
Не забудьте использовать оператор условного приведения в as?
чтобы избежать сбоя, если в "YourKey" в UserDefaults
еще нет даты.
Ответ 3
В Swift 5,
Вы можете сделать простую инкапсуляцию для лучшего управления кодом
struct UserSetting {
static var shared = UserSetting()
var practiceTime: Date?{
get {
return UserDefaults.standard.object(forKey: TimeScaler.start) as? Date
}
set(newVal){
UserDefaults.standard.set(newVal, forKey: TimeScaler.start)
}
}
}
struct TimeScaler {
static let start = "start"
}