2012-02-07 30 views
14

Tôi có ứng dụng iOS có cài đặt.bộ phận xử lý các cài đặt khác nhau cho ứng dụng của tôi với Switch toggle. Tôi đặt giá trị mặc định trong tệp root.plist của mình (sử dụng thuộc tính DefaultValue) thành YES nhưng bất kỳ lúc nào ứng dụng khởi chạy trên thiết bị hoặc trình mô phỏng iOS tất cả các giá trị đều đi NO. Nó chỉ hoạt động tốt trong lần ra mắt đầu tiên.Giá trị mặc định của nhóm cài đặt sẽ không được đặt

Settings Bundle PLIST

Tôi lấy giá trị mặc định với mã này (tôi làm điều gì sai ở đây?):

NSUserDefaults *localeDefaults = [NSUserDefaults standardUserDefaults]; 
BOOL ENWORDS = [localeDefaults boolForKey:@"localetime"]; 
+0

chúng ta có thể thấy plist là tốt? – deanWombourne

+0

Tôi đã thêm một hình ảnh –

Trả lời

14

Vấn đề là loại của default Value phải boolean không string;) xóa giá trị này và thêm một tài sản khác default Value lại hy vọng điều này giúp

+2

YEYEYEYES CẢM ƠN BẠN! –

+0

Các giá trị có thể là bất kỳ loại – user102008

20

Default Value được sử dụng bởi Settings.app chỉ cho mục đích trưng bày. Nếu bạn không thay đổi giá trị trong ứng dụng cài đặt thì không có gì được lưu vào NSUserDefaults.

Bạn phải tự mình đăng ký các giá trị mặc định. Sử dụng một cái gì đó như thế này trong application:didFinishLaunchingWithOptions::

NSDictionary *userDefaultsDefaults = [NSDictionary dictionaryWithObjectsAndKeys: 
             [NSNumber numberWithBool:YES], @"localetime", 
             nil]; 
[[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsDefaults]; 
+0

Không! không có chuyện gì xảy ra ! cùng một vấn đề ... Xcode 4.2 có rất nhiều lỗi –

+1

bạn trả lời giải quyết vấn đề khác của tôi! –

+2

+1 để được tư vấn tốt nhất, nhưng đây là giải pháp thay thế vì giá trị được đặt theo cách này có thể khác với giá trị mặc định theo dạng plist. Tốt hơn là lấy giá trị mặc định theo dạng plist làm giá trị được hiển thị nếu không có gì được đặt bởi người dùng. – jackal

19

bài viết trên blog này có thể giúp: http://greghaygood.com/2009/03/09/updating-nsuserdefaults-from-settingsbundle

tl; dr - cho đến khi người dùng mở trang cài đặt sau đó giá trị mặc định không được sao chép vào ứng dụng của bạn. Đây là hành vi mong đợi của Apple.

Cá nhân, tôi nghĩ điều này thật khủng khiếp. Nó có nghĩa là bạn sẽ phải thiết lập mặc định của bạn trong mã chỉ trong trường hợp người dùng bắt đầu ứng dụng của bạn mà không đi đến trang cài đặt đầu tiên (điều đó sẽ đúng cho khoảng 99% trường hợp sử dụng!)

+0

ops !!! có rất nhiều mã! Tôi đã từ bỏ –

+0

tl; dr là viết tắt của 'quá dài; không đọc '- đoạn thứ hai của câu trả lời của tôi tóm tắt bài đăng trên blog trong trường hợp bạn không đọc qua nó;) Về cơ bản, bạn phải xử lý các giá trị mặc định trong mã cũng như trong plist - plist chỉ có hiệu lực nếu người dùng truy cập trang cài đặt trước tiên. – deanWombourne

+1

Vui lòng xem http://ijure.org/wp/archives/179 nơi giải thích rằng không phải tất cả các loại đều có giá trị mặc định được đặt khi người dùng vào Cài đặt và trong một số trường hợp, người dùng phải thực sự chọn một giá trị khác giá trị mặc định trước khi bất kỳ giá trị nào được lưu cho mục đó. Trong trường hợp của tôi, tôi nhận thấy rằng các mục Đa giá trị không được đặt thành mặc định. – ghr

1

Bạn có thể kiểm tra xem các giá trị đã được thiết lập bằng cách objectForKey và kiểm tra xem nó là con số không.

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
    id dataExists = [userDefaults objectForKey:@"light_switch"]; 
    BOOL lightSwitch; 
    if (dataExists != nil) { 
     lightSwitch = [userDefaults boolForKey:@"light_switch"]; 
     NSLog(@"light_switch is %d", validateCertificates); 
    } else { 
     lightSwitch = YES; // default value 
     NSLog(@"light_switch not set, default value is %d", validateCertificates); 
    } 
+1

Xấu, cách xấu để giải quyết vấn đề. Sử dụng '-registerDefaults:' để thay thế. Xem http: // oleb.net/blog/2014/02/nsuserdefaults-handling-default-values ​​/ – KPM

4
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    //< Register Defaults 
    NSString *settingsBundlePath = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"bundle"]; 
    NSBundle *settingsBundle = [NSBundle bundleWithPath:settingsBundlePath]; 
    NSString *rootPlistPath = [settingsBundle pathForResource:@"Root" ofType:@"plist"]; 
    NSDictionary *settingsDict = [[NSDictionary alloc] initWithContentsOfFile:rootPlistPath]; 
    NSArray *settingsItems = [settingsDict objectForKey:@"PreferenceSpecifiers"]; 
    NSMutableDictionary *defaultDict = [NSMutableDictionary new]; 
    for (NSDictionary *itemDict in settingsItems) { 
     if ([itemDict objectForKey:@"DefaultValue"]) { 
      [defaultDict setObject:[itemDict objectForKey:@"DefaultValue"] forKey:[itemDict objectForKey:@"Key"]]; 
     } 
    } 
    [[NSUserDefaults standardUserDefaults] registerDefaults:defaultDict]; 
    //< Following Code 
} 
+0

Điều này là tốt, nếu bạn không có bất kỳ cài đặt biến nào bạn muốn có thể thay đổi từ Cài đặt iOS. Tuy nhiên, nếu bạn thay đổi câu lệnh if để kiểm tra xem 'Key' có tồn tại không và nếu không, hãy đặt đối tượng giá trị mặc định cho khóa của nó thành 'NSUserDefaults'. – mylogon

Các vấn đề liên quan