2014-02-16 4 views
0

값을 plist로 설정하려고합니다. Plist는 배열 또는 사전을 포함합니다. 사전 또는 배열은 사전 및 배열 내에 다중 배열 또는 사전을 포함 할 수 있습니다. 구조가 이와 같습니다.plist 파일의 중첩 된 사전 또는 배열에 개체를 설정하는 방법

<key>Dictionary</key> 
    <dict> 
     <key>Dictionary-2</key> 
     <dict> 
      <key>Array</key> 
      <array> 
       <array> 
        <dict> 
         <key>Test</key> 
         <string></string> 
        </dict> 
       </array> 
      </array> 
     </dict> 
    </dict> 

예. 테스트 문자열을 변경하고 싶습니다. 어떻게해야합니까? MutableDictionary와 MutableArrays를 만들 때 인덱스에 객체를 설정할 수 있습니다. 그러나 다른 모든 사전과 배열을 새로운 사전과 배열로 대체해야합니다.

더 쉬운 방법이 있습니까? 그런 다음 사전이나 배열의 모든 객체를 바꿉니 까?

답변

2

propertyListWithData:options:format:error:, 으로 속성 목록을 읽을 때 NSPropertyListMutableContainers 옵션을 설정할 수 있습니다. 당신이 단지 예를

NSPropertyListMutableContainersAndLeaves 옵션을
plist[@"key1"][@"key2"][0][@"Test"] = @"new value; 

를 들어, 내부 개체를 장착 할 수 있도록

그런 다음 반환 된 속성 목록은, 당신도 값을 수정할 수, 변경 가능한 배열 및 사전을 가지고 예를 들면 :

[plist[@"key1"][@"key2"][0][@"Test"] appendString:@"..."]; 

당신은 당신 것 하 중간 노드가 존재하는 경우 알고 여부를 다음하지 않는 경우 예를 들어, 다음과 같이 필요에 따라 파일을 만들 수 있습니다.

if (plist[@"key1"] == nil) 
    plist[@"key1"] = [NSMutableDictionary dictionary]; 
if (plist[@"key1"][@"key2"] == nil) 
    plist[@"key1"][@"key2"] = [NSMutableArray array]; 
if ([plist[@"key1"][@"key2"] count] == 0) 
    plist[@"key1"][@"key2"][0] = [NSMutableDictionary dictionary]; 

plist[@"key1"][@"key2"][0][@"Test"] = @"new value"; 
+0

괜찮 으면 좋겠지 만 plist 파일의 구조를 모르는 경우에는 어떻게해야합니까? [self.plistDict setObject : <#(id)#> forKey : <# (id ) #>];을 만들 수 없습니까? 개체를 루트 디렉터리의 하위 디렉터리로 설정하려면? –

+0

@DavidG : 중급 사전/배열이 이미 존재하는지 잘 모르는 경우 먼저 확인하고 필요한 경우에만 작성해야합니다. 그렇지 않으면 기존 노드를 겹쳐 쓰게됩니다. –

관련 문제