2015-11-17 3 views
-3

У меня есть медведь времени, получая мой NSUserDefaults, чтобы сохранить, когда пользователь принимает лицензию. Я предполагаю, что я пропустил что-то простое, но, поскольку я смотрел на это в течение двух твердых дней, я, вероятно, не видел бы этого, если бы это укусило меня. Это мой первый проект, поэтому, пожалуйста, поймите, что я очень новичок в этом. Благодарим вас за терпение и помощь.NSUserDefaults не сохраняются

В главном VC функция работает от ViewDidLoad, чтобы определить, принял ли пользователь лицензию.

override func viewDidLoad() { 
    super.viewDidLoad() 

    print("ViewController.swift View Did Load") 

    userLicense() 

Вот эта функция:

func userLicense() { 

    if licenseStatus == nil { 

     print("nil status - The NSUserDefaults value for lisenceStatus is", licenseStatus) 
     segueIdentifier = "showEULA" 
     self.segue() 
     print("First Run or Not yet accepted or declined. License Status var = ",licenseStatus) 

    } else { 

     licenseStatus = NSUserDefaults.standardUserDefaults().objectForKey("licenseStatus")! as? String 
     print("userLicense func licenseStatus var is ",licenseStatus) 

     if licenseStatus == "Declined License" { 
      print("declined status - The NSUserDefaults value for lisenceStatus is", licenseStatus) 
      segueIdentifier = "showEULA" 
      segue() 
      print("Declined License. Send user back to EULA screen") 
     } else 
      if licenseStatus == "Accepted License" { 
       NSUserDefaults.standardUserDefaults().objectForKey("licenseStatus") 
       print("accepted status - The NSUserDefaults value for lisenceStatus is", licenseStatus,". The app should run.") 
       //segueIdentifier = "backToLoginScreen" 
       //segue() 
       //print("Accepted License") 
     } 
    } 

    } 

Если пользователь не имеет лицензии, он segued к лицензии Прием VC и этот код работает:

Существует кнопка, чтобы принять Лицензия:

@IBAction func acceptEULA(sender: AnyObject) { 
    NSUserDefaults.standardUserDefaults().setObject("Accepted License", forKey: "licenseStatus") 
    licenseStatus = NSUserDefaults.standardUserDefaults().objectForKey("licenseStatus")! as! String 
    print("The Accepted func NSUserDefaults license Status is ", licenseStatus) 
    segueIdentifier = "backToLoginScreen" 
    self.passThroughError = "You have chosen to accept the user license. Click cancel to return, otherwise enjoy using MORE 2 Go." 
    self.passThroughErrorAlertController("Confirm Accept License", error: passThroughError) 
} 

И кнопка Отклонить лицензию:

@IBAction func cancelApp(sender: AnyObject) { 
    NSUserDefaults.standardUserDefaults().setObject("Declined License", forKey: "licenseStatus") 
    licenseStatus = (NSUserDefaults.standardUserDefaults().objectForKey("licenseStatus")! as? String)! 
    print("The NSUserDefaults licenseStatus is ", self.licenseStatus) 
    segueIdentifier = "backToLoginScreen" 
    self.passThroughError = "You have chosen to decine the user license. Click cancel to return, otherwise click OK and the app will be inactive." 
    self.passThroughErrorAlertController("Confirm Decline License", error: passThroughError) 
} 

Как вы видите, в этой кнопке IBActions что я установить licenseStatus var соответствующее значение. Команды print показывают в журналах, что значения установлены правильно, но когда пользователь возвращается обратно в VC входа, значение не застревает. Вот функция, где продолжение на самом деле называется, в случае, если это где я пропускаю шаг:

func passThroughErrorAlertController(title:String, error:String) { 
    let passThroughAlert = UIAlertController(title: title, message: passThroughError, preferredStyle: UIAlertControllerStyle.Alert) 
    passThroughAlert.addAction((UIAlertAction(title: "Cancel", style: .Cancel, handler: nil))) 
    passThroughAlert.addAction((UIAlertAction(title: "OK", style: .Default, handler: {action in 
     print("The user clisked OK, the license status is ", self.licenseStatus) 
     self.performSegueWithIdentifier(self.segueIdentifier, sender: self) 
     //self.dismissViewControllerAnimated(true, completion: nil) 
    }))) 
    self.presentViewController(passThroughAlert, animated: true, completion: nil) 
} 

Я извиняюсь за столь длительный пост, но как я уже сказал, я пытался осуществить это в течение двух дней, и ни одна из ссылок, которые я могу найти, по-видимому, не помогает (или я просто пропускаю forrest для деревьев сейчас, когда я так далеко). Еще раз спасибо за вашу помощь.

+0

Запишите вопрос в Google. Некоторые из первых хитов указывают на дубликаты. –

+1

Вы пытались добавить 'NSUserDefaults.standardUserDefaults(). Synchronize()' после того, как setObject в NSUserDefault? –

+4

У вас есть отладчик. Отлаживать! Шаг через код по одной строке за раз, исследуя переменные и путь исполнения, и посмотрите, что на самом деле происходит. – matt

ответ

0

Вы должны synchronize свой NSUserDefaults после установки значения к нему: NSUserDefaults.standardUserDefaults().synchronize()

или Objective-C:

[[NSUserDefaults standardUserDefaults] synchronize];

NSUserDefaults представляет собой файл, и значение настройки для него записывает данные файл - тяжелый код ввода-вывода, поэтому используйте его, только если вам нужно сохранить некоторые данные между запущенными приложениями и synchronize после ввода данных в него. Если вы используете более одного значения, вызовите его в конце, и он будет мигать со всеми последними вставленными данными в файл.

+0

Спасибо за ваш ответ. Я добавил NSUserDefaults.standardUserDefaults(). Synchronize() 'сразу после установки' NSUserDefaults', но проблема не устранена. Как было предложено в некоторых комментариях выше, я запускал отладчик, и мое значение для licenseStatus правильное, когда segue возвращает пользователя на экран входа в систему после принятия лицензии, но это значение отсутствует в главном VC, когда пользователь попадает туда, поэтому код работает так, как будто это был первый раз. ПОМОГИТЕ! – Greg

Смежные вопросы