2011-01-24 2 views
7

처음 앱을 시작할 때 설정 번들에서 기본값을 검색하는 데 문제가 있습니다. 모든 다중 값 필드는 기본값을 올바르게 반환합니다. 모든 다중 값 필드는 NULL을 반환합니다.다중 값 유형 설정 번들 필드는 항상 null을 반환합니다.

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSString *upt=[defaults objectForKey:@"upthreshold"]; 

Root.plist에서 관련 섹션은 다음과 같습니다 : 코드는 내가 현재 값을 검색하는 데 사용하고

   <dict> 
        <key>Title</key> 
        <string>Update Threshold</string> 
        <key>Type</key> 
        <string>PSMultiValueSpecifier</string> 
        <key>Key</key> 
        <string>upthreshold</string> 
        <key>DefaultValue</key> 
        <string>15</string> 
        <key>Titles</key> 
        <array> 
          <string>2 km</string> 
          <string>5 km</string> 
          <string>10 km</string> 
          <string>15 km</string> 
          <string>25 km</string> 
          <string>50 km</string> 
          <string>75 km</string> 
          <string>100 km</string> 
          <string>150 km</string> 
          <string>250 km</string> 
          <string>500 km</string> 
          <string>1000 km</string> 
        </array> 
        <key>Values</key> 
        <array> 
          <string>2</string> 
          <string>5</string> 
          <string>10</string> 
          <string>15</string> 
          <string>25</string> 
          <string>50</string> 
          <string>75</string> 
          <string>100</string> 
          <string>150</string> 
          <string>250</string> 
          <string>500</string> 
          <string>1000</string> 
        </array> 
      </dict> 

나는 "15"는 등의 현재 값으로 돌아올 것이라고 기대 기본값으로 설정됩니다. 다중 값 필드에 필요한 다른 처리가 있습니까? 앞서 말했듯이, 이전에 값을 정확하게 반환하는 6 개의 필드가 있습니다. 이 필드와 다음 2 개의 다중 값 필드는 그렇지 않습니다. 다중 값 필드는 모두 동일하게 정의됩니다.

+0

나는 이것을 오해 할 수도 있지만 "upthreshold"는 키 자체가 아닌 키 "Key"의 값인 것처럼 보입니다. –

+0

나는 모든 필드를 이런 식으로 설정했고, 내가 본 모든 예제에서는 "Key"를 이렇게 설정했다. 그리고 이것은 objectForKey 호출을 할 때 필드를 참조하는 방법이다. 나는 이것이 옳다고 생각한다. 그렇지 않다면 어떻게 정의하겠습니까? – mlewis54

+0

설정 페이지를 아직 방문하지 않은 경우 항상 기본 값에 문제가있었습니다. 나는 nil을 감지하고 app에 기본값을 하드 코드하는 경향이있다. 그것은 꽤 아니지만 그것은 작동합니다 : ( – deanWombourne

답변

21

설정 앱에서 사용자가 값을 변경하지 않은 경우 설정이 없습니다. 설정 번들에 지정된 기본값은 설정 앱에 표시되는 기본값입니다.

직접 기본값을 등록해야합니다. NSUserdefaults는 설정 번들의 기본값을 사용하지 않습니다.
다음과 같이 사용하십시오 (appdefaults에 액세스하기 전에) 앱의 시작 부분에 추가하십시오.
등록 된 사용자 기본값은 디스크 또는 기타 항목에 저장되지 않습니다. 앱을 시작할 때마다 등록해야합니다.

NSDictionary *userDefaultsDefaults = [NSDictionary dictionaryWithObjectsAndKeys: 
             @"15", @"upthreshold", 
             nil]; 
[[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsDefaults]; 
+0

고마워요. 그 속임수 않았다. 그것은 변경 전에 단일 값 필드에 대한 기본값을 일한 이상한 것 (나는 설정 응용 프로그램을 사용하여 그들을 설정하지 않음). 그것은 카운터 직관적 인 것 같습니다 앱에서 매번 설정하지 않아도되는 기본값이 아니라 프로그래밍 시간을 줄이는 기능에서 벗어나는 경우 – mlewis54

+0

이 오류는 값 유형과 관련이 없습니다. (기본값은 YES이지만 [defaults boolForKey : ...]는 NO를 반환합니다.) – 18446744073709551615

+0

방금이 문제가 발생했습니다. 하나의 키에 대해 'registerDefaults'를 수행하면 어떻게 달라 집니까? 단순히 주어진 키의 객체를 설정하면됩니까? – Besi

1

난 그냥이 문제로 실행하고이 값을 NSUserDefaults에서 읽을되지 않을 수있는 경우 설정 번들, 디폴트 값을 제공하는 이유는 자신을 부탁드립니다.

  • 이 기본

그래서에게 키가 기본 설정이 존재하지 않는 경우 지정된 키

  • 의 값을 읽고 반환 :

    나는 다음을 수행 신속한 확장을 생성 나는 이것을 할 수있다 :

    NSUserDefaults.standardUserDefaults().settignsStringValue("MYPREFS_DOMAIN", defaultValue: "domain.com") 
    

    이것은 연장이다 :

    extension NSUserDefaults{ 
    
        func settingsBoolValue(key: String, defaultValue: Bool) -> Bool{ 
         // The case for Bool is different as it would return `false` when the key is not set. 
         if let v: AnyObject = self.objectForKey(key){ 
          // The boolean value exists 
         } else { 
          self.setObject(defaultValue, forKey: key) 
         } 
    
         return self.boolForKey(key) 
        } 
    
        func settingsStringValue(key: String, defaultValue: String) -> String{ 
         if let v = self.stringForKey(key){ 
          return v 
         } else { 
          self.setObject(defaultValue, forKey: key) 
          return defaultValue 
         } 
        } 
    } 
    
  • 관련 문제