2011-06-09 19 views
20

settings.bundle değerlerini ayarlayan ve alan bir proje oluşturdum. Ayrıca settings.bundle dosyasında bazı varsayılan değerler ayarladık. Şimdi problem ben boş gösteriyor ilk defaHedefler c: settings.bundle nesnel c nasıl alınır?

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
loginName.text = [defaults objectForKey:@"login_name"]; 

olarak değerleri almak zaman, ama değerler iPhone uygulama ayarlarında belirlenen olsun. Değerleri değiştirirseniz veya manuel olarak ayarlarsanız, değerler düzgün şekilde alınır. dışarı

cevap

35

Eğer varsayılan ayarları tanımlamak rağmen

Yardım beni, onlar gerçekten bir değer olarak depolanmaz. Varsayılan olarak saklanırlar. Okumaya çalışırsanız, değer boştur. Varsayılan ayar, değer olarak başka bir özelliktir. Fakat bu, varsayılan değeri varsayılan olarak yazacağı anlamına gelmez.

Yaptığım şey, önce, bir ayarın (bir değere sahip olduğundan eminim) üzerinde kayıtlı bir şey olup olmadığını kontrol etmektir. Eğer bir şey yoksa o zaman tüm varsayılanları yazarım.

İşte bir örnek.

AppDelegate.m'de email_notificaciones_preference'un bir değerinin olup olmadığını kontrol edin, yoksa, her ayar için TÜM varsayılan ayarları yazarım.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    NSUserDefaults * standardUserDefaults = [NSUserDefaults standardUserDefaults]; 
    NSString * email_notificaciones_preference = [standardUserDefaults objectForKey:@"email_notificaciones_preference"]; 
    if (!email_notificaciones_preference) { 
     [self registerDefaultsFromSettingsBundle]; 
    } 

} 

Bu işlev, her bir öğeye varsayılan değerler yazmak için kullandığım şeydir.

#pragma NSUserDefaults 
- (void)registerDefaultsFromSettingsBundle { 
    // this function writes default settings as settings 
    NSString *settingsBundle = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"bundle"]; 
    if(!settingsBundle) { 
     NSLog(@"Could not find Settings.bundle"); 
     return; 
    } 

    NSDictionary *settings = [NSDictionary dictionaryWithContentsOfFile:[settingsBundle stringByAppendingPathComponent:@"Root.plist"]]; 
    NSArray *preferences = [settings objectForKey:@"PreferenceSpecifiers"]; 

    NSMutableDictionary *defaultsToRegister = [[NSMutableDictionary alloc] initWithCapacity:[preferences count]]; 
    for(NSDictionary *prefSpecification in preferences) { 
     NSString *key = [prefSpecification objectForKey:@"Key"]; 
     if(key) { 
      [defaultsToRegister setObject:[prefSpecification objectForKey:@"DefaultValue"] forKey:key]; 
      NSLog(@"writing as default %@ to the key %@",[prefSpecification objectForKey:@"DefaultValue"],key); 
     } 
    } 

    [[NSUserDefaults standardUserDefaults] registerDefaults:defaultsToRegister]; 

} 

Bu yardımcı olur umarım.

+0

teşekkürler! –

+0

Çok hoş bir çözüm - Onu Swift'e çevirdim ve birisinin buna ihtiyacı varsa cevap olarak ekledim. – Compufreak

+0

[[NSUserDefaults standardUserDefaults] senkronize olmalı]; 'Ayrıca eklenmeli mi? –

0

ayar desteler değerleri veri

[[NSUserDefaults standardUserDefaults] synchronize] 
5

senkronize alınırken önce bu ayarlama demetleri

NSDictionary *appDefaults = [NSDictionary dictionaryWithObject:defaultValue forKey:@"key"]; 
[[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults]; 

Varsayılan Değerlerini kaydolmak için

deneyin herkes ihtiyacı varsa - Yapmak Miquel cevabını tercüme Hızlı (hala öğrenebileceğim kadar iyi):

var standardUserDefaults = NSUserDefaults.standardUserDefaults() 
var us: AnyObject? = standardUserDefaults.objectForKey("your_preference") 
if us==nil { 
    self.registerDefaultsFromSettingsBundle(); 
} 

Ve fonk registerDefaultsFromSettingsBundle:

func registerDefaultsFromSettingsBundle() { 
    // this function writes default settings as settings 
    var settingsBundle = NSBundle.mainBundle().pathForResource("Settings", ofType: "bundle") 
    if settingsBundle == nil { 
     NSLog("Could not find Settings.bundle"); 
     return 
    } 
    var settings = NSDictionary(contentsOfFile:settingsBundle!.stringByAppendingPathComponent("Root.plist"))! 
    var preferences: [NSDictionary] = settings.objectForKey("PreferenceSpecifiers") as [NSDictionary]; 
    var defaultsToRegister = NSMutableDictionary(capacity:(preferences.count)); 

    for prefSpecification:NSDictionary in preferences { 
     var key: NSCopying? = prefSpecification.objectForKey("Key") as NSCopying? 
     if key != nil { 
      defaultsToRegister.setObject(prefSpecification.objectForKey("DefaultValue")!, forKey: key!) 
     } 
    } 
    NSUserDefaults.standardUserDefaults().registerDefaults(defaultsToRegister); 
} 
4

Güncelleme sürümü hızlı 2,1 için: Swift 3 için güncellendi

func registerDefaultsFromSettingsBundle() { 
    let userDefaults = NSUserDefaults.standardUserDefaults() 

    if let settingsURL = NSBundle.mainBundle().URLForResource("Root", withExtension: "plist", subdirectory: "Settings.bundle"), 
      settings = NSDictionary(contentsOfURL: settingsURL), 
      preferences = settings["PreferenceSpecifiers"] as? [NSDictionary] { 

     var defaultsToRegister = [String: AnyObject]() 
     for prefSpecification in preferences { 
      if let key = prefSpecification["Key"] as? String, 
        value = prefSpecification["DefaultValue"] { 

       defaultsToRegister[key] = value 
       NSLog("registerDefaultsFromSettingsBundle: (\(key), \(value)) \(value.dynamicType)") 
      } 
     } 

     userDefaults.registerDefaults(defaultsToRegister); 
    } else { 
     NSLog("registerDefaultsFromSettingsBundle: Could not find Settings.bundle"); 
    } 
} 
+0

Swift 3 için bir şey var mı? – Jonny

3

: çok zaman tasarrufu için

func registerDefaultsFromSettingsBundle() { 

    let userDefaults = UserDefaults.standard 

    if let settingsURL = Bundle.main.url(forResource: "Root", withExtension: "plist", subdirectory: "Settings.bundle"), 
     let settings = NSDictionary(contentsOf: settingsURL), 
     let preferences = settings["PreferenceSpecifiers"] as? [NSDictionary] { 

     var defaultsToRegister = [String: AnyObject]() 
     for prefSpecification in preferences { 
      if let key = prefSpecification["Key"] as? String, 
       let value = prefSpecification["DefaultValue"] { 

       defaultsToRegister[key] = value as AnyObject 
       debugPrint("registerDefaultsFromSettingsBundle: (\(key), \(value)) \(type(of: value))") 
      } 
     } 

     userDefaults.register(defaults: defaultsToRegister) 

    } else { 
     debugPrint("registerDefaultsFromSettingsBundle: Could not find Settings.bundle") 
    } 
}