2009-12-27 42 views
11

Tôi vừa thêm một gói cài đặt vào ứng dụng của mình và gặp sự cố khi đọc cài đặt bool. Tôi biết rằng khi khởi chạy ứng dụng, cài đặt sẽ không được đọc trừ khi người dùng thực sự nhập chúng - và đó là những gì tôi đang cố chụp.iphone dev - NSUserDefaults kiểm tra sự tồn tại boolean

Tuy nhiên, mã của tôi chỉ đơn giản là ghi lại nếu câu trả lời là KHÔNG HOẶC họ không được đặt. Tôi cần phải tìm hiểu xem họ đã được thiết lập, THEN đặt câu trả lời!

đang thiết lập:

BOOL playSound; 
BOOL playVibrate; 


//test for some defaults 
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
if (![prefs boolForKey:@"pref_sound"]) { 
    playSound = YES; 
    playVibrate = YES; 
} else { 
    playSound = [prefs boolForKey:@"pref_sound"]; 
    playVibrate = [prefs boolForKey:@"pref_vibrate"]; 
} 


if (playSound) { 
//do stuff 
} 

vấn đề là, nếu người dùng đặt các thiết lập để "KHÔNG", mã sau đó thay đổi cả rung và âm thanh để có - đó là có nghĩa là chụp cho KHÔNG thiết ....

bất kỳ ý tưởng nào?

Trả lời

17

Trước hết, bạn có lỗi trong số if có điều kiện. Bạn đang kiểm tra giá trị boolean chính nó, theo boolForKey: documentation, sẽ trả về NO nếu chưa được đặt. Vì vậy, boolForKey: không phải là cách phù hợp để thực hiện điều đó.

Dưới đây là hai ý tưởng khác.

Cân nhắc sử dụng cài đặt khác bằng một khóa khác để chỉ định xem cài đặt của bạn đã được khởi tạo chưa. Kiểm tra nó khi bạn khởi động ứng dụng của bạn, hoặc khi bạn lần đầu tiên đọc một thiết lập. Khởi tạo nếu cần. Ví dụ:

- (void) initializeUserDefaults { 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    if (nil == [defaults objectForKey:@"initialized_defaults"]) { 
     [defaults setBool:YES forKey:@"pref_sound"]; 
     [defaults setBool:YES forKey:@"pref_vibrate"]; 
     [defaults setObject:@"dummy_value" forKey:@"initialized_defaults"]; 
    } 
} 

Một giải pháp đơn giản hơn (nhưng tôi không chắc chắn nếu điều này sẽ làm việc) sẽ được thay đổi của bạn có điều kiện để đọc:

if (![prefs objectForKey:@"pref_sound"]) { 

Một lần nữa tôi không biết nếu điều này sẽ làm những gì tôi tưởng tượng nó sẽ, nhưng tôi tưởng tượng rằng objectForKey: sẽ trả về đối tượng boolean được đóng hộp bên dưới, nếu nó ở đó, hoặc nil.

Nếu bạn thêm cài đặt mới trong phiên bản mới của ứng dụng, bạn không muốn để cài đặt mới của mình chưa được khởi tạo và bạn không muốn dẫm cài đặt hiện tại của người dùng. Phương pháp thứ hai này làm cho điều đó dễ dàng, và trong phương pháp đầu tiên nó dễ dàng hơn để vít lên. Nhưng phương pháp đầu tiên cũng tập hợp tất cả các thiết lập của bạn ở một nơi để bạn có thể xem nó hoạt động như thế nào, mà tôi thích.

Tôi không chắc chắn về những tài liệu ADC nào sẽ xem xét thực tiễn tốt nhất. Để tìm hiểu điều đó, tôi khuyên bạn nên xem bất kỳ mẫu mã nào được tham chiếu từ tham chiếu lớp NSUserDefaults.

+3

cảm ơn vì điều này - objectForKey dường như đã thực hiện thủ thuật! Tôi đã nhận thấy boolForKey sẽ trả về NO nếu không được thiết lập, vì vậy cố gắng == nil, nhưng điều đó không làm việc. thanks :) –

+1

Niềm vui của tôi :) Mẹo cuối cùng, hãy sử dụng tùy chọn nhấp đúp vào Xcode. Tài liệu của Apple rất đáng kinh ngạc nên bạn thường có thể giải quyết các vấn đề của mình thông qua "phương pháp này làm gì"? Chúc mừng! –

+1

Đảm bảo bạn sử dụng '[mặc định đồng bộ hóa];' ở cuối câu lệnh if đó để đồng bộ hóa các giá trị. – mattblessed

0

Giải pháp của Kevin Conner phù hợp với tôi, nhưng có một điều khác mà tôi nghĩ tôi nên chỉ ra.

Ứng dụng của tôi có tùy chọn thuận tay cho thuận tay phải làm mặc định. Khi tôi nhấn chạy trong Xcode, sử dụng ứng dụng để thay đổi sở thích của tôi sang thuận tay trái, và sau đó chạy nó lần thứ hai, sở thích của tôi vẫn là thuận tay phải.

Dường như chạy trong Xcode sẽ xóa cài đặt. Tôi đã quyết định thoát khỏi ứng dụng từ bên trong trình mô phỏng, mở lại từ bên trong và sau đó tôi thấy các tùy chọn mới của mình.

+2

David - hành vi bạn đang thấy có thể là do cách bạn kết thúc chạy gỡ lỗi đầu tiên của mình. Nếu bạn nhấn nút dừng trong XCode, nsuserdefaults có thể chưa được đồng bộ hóa trước khi quá trình này bị giết. Nếu bạn thoát khỏi ứng dụng từ bên trong trình mô phỏng thì đồng bộ sẽ xuất hiện. –

1

có lẽ ý tưởng tốt nhất là đăng ký một số giá trị mặc định cho NSUserDefaults sử dụng

(void)registerDefaults:(NSDictionary *)dictionary 

thấy Apple Documentation tại https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/index.html#//apple_ref/doc/uid/20000318-SW5

Để quay trở lại vấn đề ban đầu của bạn: trong quá khứ tôi đã sử dụng NSUserDefaults. dictionaryRepresentation để kiểm tra sự tồn tại của một khóa:

BOOL playSound; 
BOOL playVibrate; 

//test for some defaults 
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
if (nil == [prefs dictionaryRepresentation]["pref_sound"]) { 
    playSound = YES; 
    playVibrate = YES; 
} else { 
    playSound = [prefs boolForKey:@"pref_sound"]; 
    playVibrate = [prefs boolForKey:@"pref_vibrate"]; 
} 


if (playSound) { 
    //do stuff 
} 

Hy vọng công việc này cho bạn.

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