2016-06-15 2 views
13

У меня есть переключатель называется SoundSwitch, я спасаю состояние кнопки с помощью пользователя по умолчанию, как, например:Swift - Как установить начальное значение для NSUserDefaults

@IBAction func soundsChanged(sender: AnyObject) { 
     if soundSwitch.on{ 
      defaults.setBool(true, forKey: "SoundActive") 
      print("Sound ON") 
     }else{ 
      defaults.setBool(false, forKey: "SoundActive") 
      print("Sound OFF") 
     } 
    } 

В настоящее время фактическое значение по умолчанию изначально ложно, когда пользователь сначала запускает приложение.

Как реализовать значения по умолчанию для true, если пользователь впервые запускает приложение, и он еще не настроен.

Я видел методы в Objective-C, но ничего в Swift. Из того, что я видел, вы можете сделать это в делетете приложения каким-то образом или в файле plist. Как мне сделать это?

+0

В приложении appDelegate вы можете проверить, имеет ли значениеForKey значение null. Если это значение null, вы можете установить его на boolean true – Dominic

+0

см .: http://iosdevcenters.blogspot.com/2016/05/save-data-using-nsuserdefaults-in-swift.html –

ответ

3

Нет ничего конкретного или специального делегата приложения.

Начальные значения по умолчанию устанавливаются путем вызова registerDefaults: на примере standardUserDefaults.

Вы можете сделать этот звонок несколько раз, и я бы рекомендовал вам не делать это в делете приложения, а вместо этого регистрировать соответствующие данные в соответствующее время в приложении, поэтому, если у вас есть 1 контроллер/подсистема просмотра, который использует определенные значения по умолчанию, затем регистрируют значения по умолчанию как часть инициализации, если этот код.

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

+0

Зачем вам это делать? делегат приложения? – Daniel

+1

, потому что делегат приложения существует для определенной цели, а произвольная регистрация по умолчанию для пользователей не является частью этой цели. @simpleBob - быть делегатом приложения и обрабатывать события уровня приложения, ничего больше – Wain

+0

Но регистрация по умолчанию пользователя должна быть выполнена до что-то еще, поэтому 'didFinishLaunchingWithOptions' было бы довольно очевидным местом, и именно там оно встречается в большинстве проектов. Кроме того, я думаю, что лучше иметь все значения по умолчанию в одном месте, чем иметь несколько 'registerDefaults' по всему проекту. – Daniel

0

Если вы действительно хотите сделать это таким образом, поставить это в AppDelegate:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

    let defaults = NSUserDefaults.standardUserDefaults() 
    if defaults.valueForKey("SoundActive") == nil { 
     defaults.setBool(true, forKey: "SoundActive") 
    } 

Если используется только в одном ViewController, рассмотреть вопрос о создании кода в методе viewDidLoad вместо этого!

+0

Я не думаю, что это хороший способ, потому что каждый раз, когда я запускаю приложение, он запускает эти коды. Но на самом деле это необходимо только в первый раз. –

+0

ОК, вы его редактируете. Но я думаю, что лучшее место - это когда вы используете значение «SoundActive», если nil then true. –

1
func lastStatus() -> Bool { 
    let defaultValue = true 
    if let value = default.valueForKey("SoundActive") { 
     // then use it 
     return value as? Bool ?? defaultValue 
    } else { 
     // oh, no value? 
     return defaultValue 
    } 
} 

Я думаю, что это лучший способ его использования. Также register(defaults:) поможет, но в документации Apple предлагает использовать его как fallback, например, разделяющую ситуацию no value и default value. В зависимости от ваших потребностей.

0

Поместите это в свой «didFinishLaunchingWithOptions» в AppDelegate.

if defaults.valueForKey("launchedAlready") == true { 
     print("Not first launch.") 
    } 
    else { 
     defaults.setValue(true, forKey: "launchedAlready") 
     defaults.setBool(true, forKey: "SoundActive") 
     print("Sound ON") 
    } 
5

Использование "registerDefaults" вы можете установить значение по умолчанию NSUserDefaults

let userDefaultsDefaults = [ 
      "SoundActive" : true 
     ] 

NSUserDefaults.standardUserDefaults().registerDefaults(userDefaultsDefaults) 

Примечание: написать в didFinishLaunchingWithOptions, поэтому значение по умолчанию установлено.

записи ниже кода, где вы хотите, чтобы проверить

let onoroff = NSUserDefaults.standardUserDefaults().objectForKey("SoundActive") as! Bool! 

if (onoroff != nil && onoroff == false) 
{ 
    self.checkForAgreement() 
} 
32

Swift 3 пример синтаксиса

Регистрация логическое значение по умолчанию:

UserDefaults.standard.register(defaults: ["SoundActive" : true]) 

И к получить значение:

UserDefaults.standard.bool(forKey: "SoundActive") 

Sidenote: Хотя приведенный выше код возвращает истину, обратите внимание, что значение на самом деле не записываются на диск, пока не установлено это:

UserDefaults.standard.set(true, forKey: "SoundActive") 
-2

Установить и получить звуковой активации.

var isSoundActivated: Bool { 
     get { 
      return defaults.bool(forKey: "SoundActive") 
     } 
     set { 
      defaults.set(newValue, forKey: "SoundActive") 
      defaults.synchronize() 
     } 
    } 

Установленное значение BOOL по

isSoundActivated = true 

логическое значение проверки по

if isSoundActivated { 
    print("sound activated") 
} 
2

Добавьте это в didFinishLaunchingWithOptions методом из AppDelegate. Как указывали некоторые другие, старайтесь не злоупотреблять, вкладывая все в этот метод.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

    /// Here you can give default values to your UserDefault keys 
    UserDefaults.standard.register(defaults: [ 
     "SoundActive": true, 
     "someOtherKey": "Some Message" 
     ]) 
} 
Смежные вопросы