2012-09-02 2 views
0

plist 파일의 데이터를 NSMutableArray로 구문 분석하려고합니다. 내 PLIST 루트에서NSMutableArray에서 값을 추출하는 데 문제가 있습니다.

내가 함께 IBOutlet UILabel의 * LBL4 객체로 꺾어 레이블을 만든

6 개 숫자의 배열을 포함하는 사전 내가 라벨을 만든 배열의 첫 번째 요소를 표시하려면 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>Dadi</key> 
    <array/> 
    <key>D4</key> 
    <integer>0</integer> 
    <key>D6</key> 
    <integer>0</integer> 
    <key>D8</key> 
    <integer>0</integer> 
    <key>D10</key> 
    <integer>0</integer> 
    <key>D12</key> 
    <integer>0</integer> 
    <key>D20</key> 
    <integer>0</integer> 
</dict> 
</plist> 

디버그 출력이 "라고 2012년 9월 2일 18 : 29 : 55.483 믿음 [6014 : 707]

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *docPath = [paths objectAtIndex:0]; 
NSString *plistPath = [docPath stringByAppendingPathComponent:@"settings.plist"]; 

if(![[NSFileManager defaultManager] fileExistsAtPath:plistPath]); 
{ 
    plistPath = [[NSBundle mainBundle] pathForResource:@"settings" ofType:@"plist"]; 
} 

NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath]; 
NSString *err = nil; 
NSPropertyListFormat format; 

NSDictionary *temp = (NSDictionary *) [NSPropertyListSerialization propertyListFromData:plistXML mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&err]; 
if(!temp) 
{ 
    NSLog(@"Error reading plist: %@, format: %d", err, format); 
} 

self.dataSet = [NSMutableArray arrayWithArray:[temp objectForKey:@"Dadi"]]; 
[lbl4 setText:[NSString stringWithFormat:@"%@", [dataSet objectAtIndex:0]]]; 

PLIST 소스 코드는 다음과 같습니다 * 인해 캐치되지 않는 예외 'NSRangeException'응용 프로그램 종료, 이유는 : '* - [__ NSArrayM objectAtIndex :] : 빈 배열 범위를 넘는 인덱스 0' "당신의 plist에서

+0

충돌 오류 메시지 란 무엇입니까? –

+0

그리고 속성 목록을 보여줄 수 있습니까? (어떤 실제 문자열 foo - ize 무료) –

+0

plist 추가 및 질문에 디버그 출력! –

답변

1

는 사전의 Dadi 키에 저장된 배열이 비어 !

<key>Dadi</key> 
    <array/> 

그래서 빈 배열로 self.dataSet

self.dataSet = [NSMutableArray arrayWithArray:[temp objectForKey:@"Dadi"]]; 

세트 (즉, 짝수 인덱스 0의 범위를 넘는 것이다).

이 경우 se.f.dataSet.count == 0을 확인하고 기본값을 제공합니다.

@warrenm은 plist의 구조가 예상 한 것과 다르다는 의견에 언급했습니다. 이들은 XML 파일이므로 />으로 끝나는 모든 태그는 "자동 닫기"이므로 항상 비어입니다. 그 번호를 포함, 당신은 종료 태그를 추가하고 내부를 배치해야합니다 : 물론

<array> 
    <integer>7</integer> 
</array> 

, 추가 평가에, 기존의 plist 그와 관련된 키를 가지고 있으므로이 또한 가능성이 올바른 해결책이 아니다. 그 plist에 대한 귀하의 요구가 무엇인지 평가할 필요가 있습니다.

+0

난 정말 이유를 모르겠지만, 내가 (튜토리얼에서 복사)이있는 PLIST 소스 코드를 변경하는 것이 지금 작동합니다 '{ \t 다디 = ( \t \t 0, \t \t 0, \t \t 0, \t); } ' 지금은 왜 작동합니까? 그것은 XML이 아닙니다! 어떤 종류의 plist이고 왜 작동 하는가? –

+0

JSON이 아닌 plist입니다 (거의 100 % 호환 됨). JSON에서 {}는 object-> NSDictionary를 의미하고()는 array-> NSArray를 의미합니다. –

관련 문제