2014-07-26 3 views
0

iOS 개발 초보자이며 파일에 사전 개체 배열을 쓰는 데 문제가 있습니다.pList writeToFile 사전 배열 - 마지막 배열 항목 만 쓰여짐

여기 내 코드입니다 ... 그리고 난 다음 무엇을해야하는지 생각 :

// Step 1. Copy the plist in the App bundle and create one in the Documents directory 

NSError *error; 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"Devices.plist"]; 

NSFileManager *fileManager = [NSFileManager defaultManager]; 

if (![fileManager fileExistsAtPath: path]) 
{ 
    NSString *bundle = [[NSBundle mainBundle] pathForResource:@"Devices" ofType:@"plist"]; 

    [fileManager copyItemAtPath:bundle toPath: path error:&error]; 
} 



// Step 2). Read my plist into a number of internal arrays. 

NSArray *rootArray = [NSArray arrayWithContentsOfFile:path]; 

nameArray   = [[NSMutableArray alloc] init]; 
MACArray   = [[NSMutableArray alloc] init]; 
imageArray   = [[NSMutableArray alloc] init]; 
blockArray   = [[NSMutableArray alloc] init]; 
synchronisedArray = [[NSMutableArray alloc] init]; 


for (NSDictionary *itemData in rootArray) 
{ 
    [nameArray addObject:[itemData objectForKey:@"name"]]; 
    [MACArray addObject:[itemData objectForKey:@"MAC"]]; 
    [imageArray addObject:[itemData objectForKey:@"image"]]; 
    [blockArray addObject:[itemData objectForKey:@"block"]]; 
    [synchronisedArray addObject:[itemData objectForKey:@"synchronised"]]; 
} 



// Step 3. Load my internal arrays into an array of dictionaries. 

NSMutableDictionary *outData = [[NSMutableDictionary alloc] init]; 
NSMutableArray *outArray = [[NSMutableArray alloc] init]; 

for (int i = 0; i<[nameArray count]; i++) 
{ 
    [outData removeAllObjects]; 

    [outData setValue:[nameArray objectAtIndex:i]   forKey:@"name"]; 
    [outData setValue:[MACArray objectAtIndex:i]   forKey:@"MAC"]; 
    [outData setValue:[imageArray objectAtIndex:i]  forKey:@"image"]; 
    [outData setValue:[blockArray objectAtIndex:i]  forKey:@"block"]; 
    [outData setValue:[synchronisedArray objectAtIndex:i] forKey:@"synchronised"]; 


    [outArray addObject: outData]; 

    NSLog(@"Last object in outArray at %i is %@", i, [outArray objectAtIndex:i]); 
    NSLog(@"---------------------------"); 
} 


// Step 4). Write the array back out to the plist. 

BOOL result = [outArray writeToFile: path atomically:YES]; 

if (result) 
    NSLog(@"Result YES"); 
else 
    NSLog(@"Result NO"); 

설명 :

1). App 번들에서 plist를 읽고 나중에 직접 쓸 수 있도록 Documents로 직접 복사하십시오.

2). 새로 만든 plist를 읽고 NSMutableArray 객체에로드합니다.

... 기본 프로그램 코드 여기 (이 예에서는 생략 됨).

3). 내부 배열을 읽고 NSDictionary 객체를 만들고 각각을 NSMutableArray (outArray)에 추가합니다.

4). outArray를 plist에 씁니다.

마지막 단계를 제외하고는 모두 잘 작동합니다. 내가 plist를 볼 때 예상되는 3 개의 입구가있다. .. 그러나. 그들은 모두 같다. outArray의 마지막 항목의 사본입니다.

2014-07-27 09:19:29.533 Filter[7143:60b] Last object in outArray at 0 is { 
    MAC = "00:26:B0:CF:48:32"; 
    block = 0; 
    image = "laptop-50"; 
    name = Laptop; 
    synchronised = 1; 
} 
2014-07-27 09:19:29.537 Filter[7143:60b] --------------------------- 
2014-07-27 09:19:29.539 Filter[7143:60b] Last object in outArray at 1 is { 
    MAC = "00:26:B0:CF:48:32"; 
    block = 0; 
    image = "joystick-50"; 
    name = PS3; 
    synchronised = 0; 
} 
2014-07-27 09:19:29.540 Filter[7143:60b] --------------------------- 
2014-07-27 09:19:29.541 Filter[7143:60b] Last object in outArray at 2 is { 
    MAC = "B8:FF:61:09:BC:EE"; 
    block = 1; 
    image = "ipad_copyrighted-50"; 
    name = "Logan's iPad"; 
    synchronised = 1; 
} 
2014-07-27 09:19:29.542 Filter[7143:60b] --------------------------- 
2014-07-27 09:19:29.593 Filter[7143:60b] Result YES 

어떤 도움/조언 감사합니다 ... 감사 :

다음은 NSLog 출력입니다. 기존 키를 작성하는 것처럼

답변

0

은 아주 많이 ... 문제를 해결 즉, 위의 코드이 하나 개

// Step 3. Load my internal arrays into an array of dictionaries. 


NSMutableArray *outArray = [[NSMutableArray alloc] init]; 

    for (int i = 0; i<[nameArray count]; i++) 
    { 
     NSMutableDictionary *outData = [[NSMutableDictionary alloc] init]; //add this line here 

     [outData setValue:[nameArray objectAtIndex:i]   forKey:@"name"]; 
     [outData setValue:[MACArray objectAtIndex:i]   forKey:@"MAC"]; 
     [outData setValue:[imageArray objectAtIndex:i]  forKey:@"image"]; 
     [outData setValue:[blockArray objectAtIndex:i]  forKey:@"block"]; 
     [outData setValue:[synchronisedArray objectAtIndex:i] forKey:@"synchronised"]; 


     [outArray addObject: outData]; 

     NSLog(@"Last object in outArray at %i is %@", i, [outArray objectAtIndex:i]); 
     NSLog(@"---------------------------"); 
    } 
+0

덕분에 새로운 values.Replace에 우선하여 적용됩니다. 나는 outArray가 포인터의 목록 일 뿐이라는 것을 잊어 버렸습니다 ... 그리고 나는 똑같은 것을 가리키는 모든 항목을 가지고있었습니다! –