2011-03-22 2 views
31

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];,아이폰 - NSUserDefaults standardUserDefaults에 키가 있는지 감지하는 방법

BOOL boolFromPrefs = [defaults boolForKey:@"theBoolKey"];과 같은 호출을 사용합니다. 저장된 BOOL 값을 얻으려면.

키가 발견되지 않으면 NO가 리턴됩니다 (boolForKey의 기본 동작).
하지만 ... NO는 저장된 설정이 될 수 있습니다. intForKey

도 마찬가지입니다. 값을 얻기 전에 키가 있는지 어떻게 테스트 할 수 있습니까?

답변

61

올바른 방법과 register default values하십시오.

NSDictionary *userDefaultsDefaults = @{ 
    @"SomeKey": @NO, 
    @"AnotherKey": @"FooBar", 
    @"NumberKey": @0, 
}; 
[NSUserDefaults.standardUserDefaults registerDefaults:userDefaultsDefaults]; 

NSUserDefaults부터 사용하기 전에 수행하십시오. application:didFinishLaunchingWithOptions:의 시작 부분은 안전한 장소입니다.

앱을 시작할 때마다 기본값을 등록해야합니다. NSUserDefaults는 명시 적으로 설정된 값만 저장합니다.

기본값을 사용하는 경우 다른 답변에서 제안 된 것처럼 "isFirstLaunch"키를 확인할 필요가 없습니다.
업데이트를 롤아웃 할 때 NSUserDefaults 항목의 기본값을 변경하려는 경우 도움이됩니다.

+1

나는 귀중한 선택이지만, 기본값을 등록하지 않으면 유익한 방법을 알 수 있습니다. 사용자가 명시 적으로 yes 또는 no로 설정했는지 또는 모두 설정하지 않았는지 알 수있는 3 진 로직을 제공합니다. – Joe

+0

잘 모르겠지만이 방법이 처음 1.0 버전에서는 잘 작동한다고 생각합니다. 나중에 환경 설정 계층에서 큰 변화가있는 경우 전체 내용을 재발송하기 위해 작성된 내용과 그렇지 않은 내용을 알아야 할 것입니다. 아마도 ... 파일에 단일 Prefs 버전을 포함하는 것으로 충분할 것입니다. 나도 몰라, 나는 오래된 Preference 파일로 미래에 어떤 문제를 예방하기 위해이 일을하고있다. 이것에 관해 좋은 읽을 거리를 알고 있습니까? – Oliver

+0

이러한 기본값은 NSUserDefaults에 기록되지 않으므로 (이후 출시 할 때마다 등록해야합니다), 이후 버전에서 새 기본값을 사용하려면 새 기본값을 등록하면됩니다. 사용자가 새로운 기본값을 사용하는 설정을 건드린 적이없는 경우 설정을 변경하면 자신의 설정을 사용하려고 할 가능성이 큽니다. –

8

objectForKey:을 사용하여 테스트 할 수 있으며이 값이 nil이면 설정되지 않습니다. 모든 boolForKey는 NSNumber이 있으면 반환하고 BOOL 값을 반환합니다.

+3

MonoTouch 사용자 참고 사항 : 내부적으로 표시되어있어 'ObjectForKey (key)'메소드에 액세스 할 수 없습니다. 대신 인덱서 인'NSUserDefaults.StandardUserDefaults [key]'를 사용하십시오. –

29

개체가 BOOL로 변환되기 전에 존재하는지 확인하십시오.

if ([defaults objectForKey:@"theBoolKey"] != nil) { 
    boolFromPrefs = [defaults boolForKey:@"theBoolKey"]; 
} else { 
    boolFromPrefs = DEFAULT_BOOL_VALUE; 
} 
+2

bool이 false 인 경우 작동하지 않습니다. – phatmann

+0

@phatmann 왜 그런가요? afaik, ObjectForKey는 설정되지 않은 경우 nil을, 거짓이면 0을, 참이면 1을 반환합니다. – Pega88

+0

@ Pega88 이전 버전의 iOS에서이 접근법에 문제가 있었고 다른 사람들도 같은 문제에 주목했습니다. 사실 이것이 왜 stackoverflow를 검색했는지입니다.최신 운영체제에서이 동작이 변경되었는지 그리고 정확한 조건이 발생하는지는 알 수 없습니다. – phatmann

2

응용 프로그램에서 사용할 수있는 키의 기본값을 설정하는 것이 좋습니다. doFinishLaunchingWithOptions : 메소드에서이 작업을 수행 할 수 있습니다. 그렇게하면 각 값이 설정되었음을 알 수 있습니다.

힌트, "defaultsSet"이라는 키를 YES로 설정하면 한 번만 수행 할 수 있습니다. 또한 값을 저장하려면 [[NSUserDefaults standardUserDefaults] synchronize]를 호출해야합니다.

+0

"한 번만이 작업을 수행 할 수 있도록"defaultsSet "이라는 키를 YES로 설정한다는 것은 무엇을 의미합니까? – Oliver

+0

저는 기본값이 한 번만 설정되고 사용자 변경 사항을 덮어 쓰지 않도록하는 방법으로 제안했습니다. 당신은 무엇이라도 부를 수 있습니다, 그것은 단지 알려진 가치로 설정된 다른 열쇠입니다. – picciano

+0

죄송합니다. 피곤할 수 있습니다. 그러나 나는 아직도 당신이 의미하는 바를 정확히 이해하지 못합니다. 예를 들어 주시겠습니까? – Oliver

24

나는 이런 식으로했다 :

NSUserDefaults *prefs = NSUserDefaults.standardUserDefaults; 
if ([[prefs dictionaryRepresentation].allKeys containsObject:@"yourKey"]) { 
    float yourValue = [prefs floatForKey:@"yourKey"]; 
} 
MarkPowell의 답변에 따라
+0

이것은 값이 EQUAL 0 일 수 있으므로 반환 된 값을 평가하는 것이 올바르지 않을 수 있기 때문에 최상의 솔루션입니다. – avenged

+0

성능이 걱정됩니다. 이 때마다 사용자 기본값을 사전으로 변환하는 데 시간이 걸립니까? –

0

스위프트 예

if (NSUserDefaults.standardUserDefaults().objectForKey("SomeBoolSetting") == nil) { 
    NSUserDefaults.standardUserDefaults().setBool(true, forKey: "SomeBoolSetting") 
    println("Bool WAS nil") 
} else { 
    var boolValue:Bool? = NSUserDefaults.standardUserDefaults().boolForKey("SomeBoolSetting") 
    println("Bool WAS NOT nil \(boolValue)") 
} 
0
@ 팀 Autin의 대답

빠른 버전 :

if contains(NSUserDefaults.standardUserDefaults().dictionaryRepresentation().keys.array, "chuiser_cook_orders_dirty") { 
    println("exist") 
} 
+0

Swift 3 구문은 여전히 ​​깨끗합니다. 조건을 다음과 같이 줄입니다 :'UserDefaults.standard.dictionaryRepresentation(). keys.index (of : "chuiser_cook_orders_dirty")! = nil' –

0

말라가 복잡 :

if([NSUserDefaults.standardUserDefaults objectForKey:@"yourBoolKey"]) 
{ 
    // Object Already Stored in User defaults 
} 
else 
{ 
    //Object not stored 
} 
관련 문제