2011-05-07 6 views
2

문자열을 배열 요소로 Settings.bundle Root.plist에 저장하고 후속 실행시 Setting 번들에서 해당 문자열에 액세스 할 수 있습니다. 나는 이것에 대한 좋은 예를 찾을 수 없었다. 엑스 코드에서, 나는 Root.plist을 만들었으며이 같은 같습니다설정 번들에서 배열 요소를 만들고 액세스하는 방법

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
<key>StringsTable</key> 
<string>Root</string> 
<key>PreferenceSpecifiers</key> 
<array> 
    <dict> 
     <key>Type</key> 
     <string>PSTitleValueSpecifier</string> 
     <key>Title</key> 
     <string>My Title</string> 
     <key>Key</key> 
     <string>My Identifier</string> 
     <key>Values</key> 
     <array> 
      <string>my string 1</string> 
      <string>my string 2</string> 
      <string>my string 3</string> 
     </array> 
    </dict> 

을 내가에서 값의 액세스를 시도하는 다음 코드를 사용하고 다음과 같이이 XML을 생성

Key 
iPhone Setting Schema 
    Strings Filename 
    Preference Items 
     Item 0 (Title- My Title) 
      Type   Title 
      Title   My Title 
      Identifier  My Identifier 
      Values 
       Item 0  my string 1 
       Item 1  my string 2 
       Item 3  my string 3 

을 식별자 키 "My Identifier":

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSArray *mystrings = [defaults arrayForKey:@"My Identifier"]; 
for (int i=0;i<3;i++) { 
    NSLog(@"%@", [mystrings objectAtIndex:i]); 
} 

런타임시 mystrings의 값은 0입니다. 따라서 "내 문자열 1", "내 문자열 2"및 "내 문자열 3"의 값은 NSLog에서 인쇄하지 않습니다.

사람이 좀 도와 수 있습니다. 또한 이러한 값을 업데이트하는 올바른 방법은 무엇입니까? 문제의

답변

2

부분은 제목 "Specifying Default Values for Preferences"에서 언급 : 응용 프로그램의 설정에서

기본 환경 설정 값은 설정 응용 프로그램이 실행될 때까지 설정되지 않은 번들. 즉, 사용자가 설정을 실행하기 전에 응용 프로그램을 실행하면 설정 번들에 지정된 기본값을 사용할 수 없습니다. 설정 번들

모든 물건은 사용자가 설정 응용 프로그램을 엽니 다 후 때까지 앱의 디폴트 데이터베이스에로드되지 않습니다. 이게 바보 같아 보이니? 나 한텐 바보 같아. 결과적으로 처음에 모든 기본값을 등록해야합니다. 나는 무슨 일이 일어나고 있는지 알아 내려고 노력하면서이 글을 썼다. 개선이 확실히 할 수 있지만, 당신이 시작해야합니다

NSURL * settingsURL = [[NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"Settings" withExtension:@"bundle"]] 
         URLForResource:@"Root" withExtension:@"plist"]; 
NSDictionary * settingsDict = [NSDictionary dictionaryWithContentsOfURL:settingsURL]; 
NSArray * settingsArr = [settingsDict objectForKey:@"PreferenceSpecifiers"]; 
NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults]; 
for(NSDictionary * setting in settingsArr){ 
    NSString * key = [setting objectForKey:@"Key"]; 
    if(!key) continue; // Some objects don't have keys 
    if(![defaults objectForKey:key]){ 
     [defaults setObject:[setting objectForKey:@"DefaultValue"] 
        forKey:key]; 
    } 
} 

당신이 [defaults objectForKey:@"myTitlePreferencesKey"]을 할 때 PSTitleValueSpecifier 키의 배열을하지 않는 것이이 또 다른 문제; 너는 단 하나의 문자열을 얻는다. 키/값 쌍 @"DefaultValue"that item's dictionary의 일부 여야합니다. 처음에는 문자열이어야하는 그 값을 얻을 것입니다. 값을 변경하면 Values 배열의 해당 객체와 동일한 색인을 가진 Titles 배열에서 문자열을 가져옵니다. 배열이 Values 인 경우 Titles 배열이 있어야합니다. 당신은 환경 설정의 값을 변경하려는 경우 귀하의 질문의 두 번째 부분에 대한

는, 당신은 단순히 답장을

[[NSUserDefaults standardUserDefaults] setObject:myValue 
              forKey:@"myKey"]; 
+0

감사를 수행하지만 불행히도 그것은 작동하지 않습니다. mystrings의 값은 여전히 ​​0x0입니다. 또한, "가치"키가 고유하지 않으므로 여러 가지 기본 설정 항목이있는 경우이 제안이 효과가 있다고 생각하지 않습니다. 지금까지 읽은 문서를 어떻게 해석했는지에 따라 키 "My Identifier"가 사용자 데이터의 고유 키로 지정해야하는 키이어야합니다. 당신은 바른 길 위에 있을지 모르지만 제가 말했던 것처럼, 그것은 효과가 없었습니다. – JeffB6688

+0

@Jeff : 고유 한 키 _has_; 그것은 사전입니다. @ "My Identifier", @ "Value", @ "Yellow Zebras"등 원하는 키를 사용할 수 있지만 각 키 중 하나만 존재할 수 있습니다. 이 파일의 위치를 ​​명확히 할 수 있습니까? 나는 그것이 당신의 진짜 문제일지도 모른다고 생각합니다. 어떤 문서를 말하는 겁니까? –

+0

Root.plist는 설정의 일부입니다.내 Resources 폴더 안에있는 번들. 네, 고유 한 키를 지정해야한다는 것을 알고 있습니다. 새 항목이 "제목"항목 인 xcode에서 Root.plist 파일 내에 환경 설정 항목을 만들 때 xcode는 자동으로 4 개의 키 (유형, 제목, 식별자 및 기본값)를 만듭니다. "기본값"키를 "값"키로 변경할 수 있습니다. 그렇게하면 항목 키가 만들어집니다 (항목을 계속 추가 할 수 있습니다). 항목 키의 경우 문자열 값 (예 : '내 문자열 1')을 지정할 수 있습니다. 나는 다음 댓글 (제한된 크기)을 계속할 것입니다. – JeffB6688

관련 문제