2010-01-16 25 views
33

Tôi có một lớp AppDelegate với phương thức +(void)initialize mà tôi sử dụng để đăng ký một số giá trị mặc định. Dưới đây là đoạn code mà tôi sử dụng:Cách đăng ký mặc định người dùng bằng NSUserDefaults mà không ghi đè giá trị hiện tại?

+ (void)initialize { 
    NSDictionary *defaults = [NSDictionary dictionaryWithObjectsAndKeys:@"NO", @"fooKey", @"YES", @"barKey", nil]; 

    [[NSUserDefaults standardUserDefaults] registerDefaults:defaults]; 
} 

Tôi cũng tạo Preferences.xib nắm giữ vài hộp kiểm (NSButton) mà hiển thị trạng thái của sở thích. Chúng được gắn với NSUserDefaultsController với cùng các khóa (fooKey và barKey trong trường hợp này). Mỗi khi tôi khởi chạy ứng dụng và thay đổi "mặc định", chúng sẽ được khôi phục vào lần khởi chạy ứng dụng tiếp theo.

Có cách nào để đăng ký "mặc định mặc định" mà không ghi đè các giá trị hiện có không? Có lẽ mỗi lần tôi xây dựng và khởi chạy một ứng dụng, tệp tùy chọn của nó đang được tạo lại? Có lẽ tôi nên unbind hộp kiểm tra từ NSUserDefaultsController và duy trì các giá trị của các phím bản thân mình với một số mã tùy chỉnh trong bộ điều khiển cửa sổ tùy chọn?

Tôi muốn nghe việc triển khai lựa chọn của bạn để duy trì mặc định của người dùng.

Tôi đang sử dụng Mac OS X 10.6.2 và XCode 3.2.1

+0

Hãy chắc chắn rằng các hộp kiểm bên chắc chắn sẽ "chung Defaults tài điều khiển", phím điều khiển "giá trị", mô hình con đường quan trọng "fooKey"/"barKey". Nếu không, mã của bạn sẽ ổn với tôi. – Costique

+5

'@" NO "' không phải là một chữ Boolean; nó là một chuỗi chữ cho chữ "KHÔNG". Bạn nên sử dụng '[NSNumber numberWithBool: NO]'; nếu không, các giá trị trong mặc định của người dùng sẽ không phải là Booleans. –

+0

Không, họ sẽ không, nhưng nếu tôi đọc chúng như là BOOL - họ sẽ làm như vậy. Trích từ cuốn sách "Lập trình Cacao" của Daniel H Steinberg (pragprog.com): Trên thực tế, bạn không cần phải rõ ràng khi bạn đặt BOOL trong từ điển. Bạn có thể chuyển giá trị YES hoặc NO thành chuỗi và vẫn tạo BOOL từ giá trị này khi bạn đọc từ các tùy chọn. – Eimantas

Trả lời

75

Từ tài liệu cho -registerDefaults: (nhấn mạnh thêm):

Nội dung của miền đăng ký không được ghi vào đĩa ; bạn cần gọi phương thức này mỗi khi ứng dụng của bạn bắt đầu. Bạn có thể đặt một tệp plist trong thư mục Resources của ứng dụng và gọi registerDefaults: với nội dung mà bạn đã đọc từ tệp đó.

Vì vậy, mã của bạn đã đi đúng hướng. Đây là cách bạn đăng ký mặc định mặc định.

Tôi thường sử dụng này trong -applicationDidFinishLaunching::

// Load default defaults 
[[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Defaults" ofType:@"plist"]]]; 

Sử dụng một plist làm cho nó dễ dàng để thêm và thay đổi giá trị mặc định trong ứng dụng của bạn, và nó ngăn cản bạn từ những sai lầm của việc sử dụng @"NO" như một giá trị quá.

Edit: Swift 3 biến thể:

UserDefaults.standard.register(defaults: NSDictionary(contentsOf: Bundle.main.url(forResource: "Defaults", withExtension: "plist")!)! as! [String : Any]) 
+0

Johan - cảm ơn vì mắt mở. Tôi kiểm tra lại cuộc gọi và có vẻ như nó hoạt động mà không có bất kỳ câu lệnh nào! – Eimantas

+0

Mã "mặc định tải mặc định" ở trên có thể được sử dụng với gói Cài đặt không? Ví dụ, tôi có thể sử dụng tệp Root.plist để khởi tạo mặc định của mình không? – Ricky

+0

Có, mặc dù gói Cài đặt của bạn có thể được tải trước khi ứng dụng của bạn được khởi chạy, vì vậy bạn vẫn có thể muốn đặt mặc định ban đầu trong plist cài đặt. Phương thức '-registerDefaults:' sẽ không ghi đè các tùy chọn được thiết lập thông qua một gói Cài đặt. –

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