2012-01-12 2 views
0

나는 tableView numberofRowsinSection을 구현하는 방법을 알아 내려고 미쳤고, 팁이나 제안을 얻을 수 있기를 바랬다. 나는 모든 것을 지나치게 복잡하게 만든 것처럼 느낍니다. 이제는 NSDictionary 인 변환 된 XML 데이터를 게시하여 시작하겠습니다._NSCFString allKeys, 인식 할 수없는 선택 자입니다. NSDictionary라고 생각 했나요?

{ 
    "@body" = ""; 
    "@class_id" = ""; 
    "@title" = Discussions; 
    "@type" = "Discussion Block"; 
}, 
{ 
    "@body" = ""; 
    "@class_id" = ""; 
    "@col" = 1; 
    "@title" = YouTube; 
    "@type" = "Youtube Block"; 
    item =  { 
     "@body" = "http://www.youtube.com/watch?v=vDWhfsQHq1o&ob=av3e"; 
     "@title" = "Gavin DeGraw - Not Over You"; 
     "@type" = link; 
    }; 
}, 
{ 
    "@body" = ""; 
    "@class_id" = ""; 
    "@title" = Calendar; 
    "@type" = "Calendar Block"; 
}, 
{ 
    "@body" = "<p> homework test</p> "; 
    "@class_id" = ""; 
    "@title" = Homework; 
    "@type" = "File Block"; 
    item =  (
       { 
      "@body" = "https://MYDOMAIN.com/securelink; 
      "@title" = "crashreport.rtf"; 
      "@type" = file; 
     }, 
       { 
      "@body" = "mydomain.com/securelink"; 
      "@title" = "Chem notes sep 26.docx"; 
      "@type" = file; 
    } 
); 
}, 
{ 
    "@body" = "<p> Link testing</p> "; 
    "@class_id" = ""; 
    "@title" = Links; 
    "@type" = "Link Block"; 
    item =  (
       { 
      "@body" = "http://google.com"; 
      "@title" = Link1; 
      "@type" = link; 
     }, 
       { 
      "@body" = "http://yahoo.com"; 
      "@title" = link2; 
      "@type" = link; 
     }, 
       { 
      "@body" = "http://reddit.com"; 
      "@title" = link3; 
      "@type" = link; 
     } 
    ); 
} 
) 

위의 데이터는 응답입니다. 이 목표는 첫 번째 제목 키를 표 머리글로 사용하고 두 번째 "제목"키 ("항목"내부)를 해당 섹션의 행으로 사용하는 것입니다. tableView TitleforHeaderinSection 방법은 단순히 일이 까다로운 곳 numberofRowsinSection 방법은이 코드

for (NSDictionary *roster in response) { 
    [blockName addObject:[roster [email protected]"@title"]]; 
} 
    return [blockName objectAtIndex:section]; 

를 사용합니다. 이것은 내가 시도한 것입니다

for (NSDictionary *myDict in [[response objectAtIndex:section] valueForKeyPath:@"item"]) { 
    NSArray *keys = [myDict allKeys]; 
    if ([keys containsObject:@"@title"]) { 
     array3 = [[NSMutableArray alloc] init]; 
     [array3 addObject:[myDict objectForKey:@"@title"]]; 
    } 
} 
return array3; 

내가 받고있는 오류는 myDict가 NSString이고 allKeys를 사용할 수 없다는 것입니다. objectAtIndex : 1로 변경하면 allKeys 메서드가 작동하기 때문에 왜 이런 일이 발생하는지 잘 모르겠습니다. 또한 각 섹션에 필요한 행 수를 찾는 가장 좋은 방법이 아니라는 것을 확신합니다. 더 좋은 방법이 있으면 공유하십시오.

그냥 이것이 내가 위의 데이터를 분석 한 후 내있는 tableView에서 찾고 있어요 무엇을, 명확하게 : 당신의 도움에 대한

Header (Discussions) 
    -No rows under this header 
Header (YouTube) 
    -Row (Gavin DeGraw - Not Over You) 
Header (Calendar) 
    -No rows 
Header (Homework) 
    -Row (crashreport) 
    -Row (chem notes) 
Header (links) 
    -Row (link1) 
    -Row (link2) 
    -Row (link3) 

감사합니다. NSDictionary 및 NSArray 메서드에 대한 많은 연구를 수행했지만이 문제를 해결하는 방법이나 다른 방법으로 코드를 작성하는 방법을 잘 모르겠습니다.

답변

0

문제는 여기 ([: 부] valueForKeyPath [응답 objectAtIndex @ "항목"]에있는 NSDictionary * myDict) 용

{

이 사전 괜찮지 NSArray 객체의 NSArray를 통해 반복되기 때문에 아래에 나와 있습니다. 따라서 [myDict allKeys]이 호출되면 실제로 NSDictionary에서 호출합니다. 대신 배열의 사전 통해 반복되어 있으므로 for..in 루프는 사전의 키를 반복하기 때문에

{ 
    "@body" = "<p> homework test</p> "; 
    "@class_id" = ""; 
    "@title" = Homework; 
    "@type" = "File Block"; 
    item =  (
       { 
      "@body" = "https://MYDOMAIN.com/securelink; 
      "@title" = "crashreport.rtf"; 
      "@type" = file; 
     }, 
       { 
      "@body" = "mydomain.com/securelink"; 
      "@title" = "Chem notes sep 26.docx"; 
      "@type" = file; 
    } 
); 

는 그러나 다음 사전에 잘하지 않습니다. 그런 다음 NSString (일명 사전의 키)에 allKeys을 호출합니다.

{ 
    "@body" = ""; 
    "@class_id" = ""; 
    "@col" = 1; 
    "@title" = YouTube; 
    "@type" = "Youtube Block"; 
    item =  { 
     "@body" = "http://www.youtube.com/watch?v=vDWhfsQHq1o&ob=av3e"; 
     "@title" = "Gavin DeGraw - Not Over You"; 
     "@type" = link; 
    }; 
}, 

이 대신 같은 뭔가를 할 수 :

id item = [[response objectAtIndex:section] valueForKeyPath:@"item"]; 
if(item) { 
    if([item isKindOfClass:[NSDictionary class]]) { 
     NSArray *keys = [(NSDictionary *)item allKeys]; 
    } else if([item isKindOfClass:[NSArray class]]) { 
     for (NSDictionary *myDict in (NSArray *)item) { 
      NSArray *keys = [myDict allKeys]; 
     } 
    } 
} 
else { 
    return 0; 
} 
+0

좋아, 그 덕분에 의미가 있습니다. 그래서 내가 사용하는 방법은 모든 헤더에 대해 2 개 이상의 항목이있는 경우에만 작동 할 것입니다? 이 테이블을 설정하는 다른 방법이 있습니까? – davis

+0

내 의견보기 내 대답을 –

+0

awesome, thanks so much. else {return 0}을 추가하여 valueforkeypath 항목이없는 행을 표시하지 않았습니다. – davis

0

이의는 "항목"키가있는 경우 다음 해당 개체는 항목의 NSArray를 있다고 가정합시다.

시도 :

NSArray *items = [[response objectAtIndex:section] valueForKey:@"item"]; 

if (items!=nil) { 
    return [items count]; 
} else { 
    return 0; 
} 
관련 문제