2009-08-18 5 views
2

iPhone YouTube 앱의 '가장 많이 사용되는' 섹션과 인터페이스의 일부가 정확히 일치하는 iPhone 앱을 제작할 예정입니다.UITableView가 제대로 업데이트되지 않습니다. (심지어 reloadData 호출로)

이 '인기'섹션 하단에 탭 바에서 액세스 및 상단의 탐색 바는 선택하기 UISegmentedControl이 포함되어 있습니다

', 오늘 이번 주, 월 등 ..'

의 대부분 때문에 응용 프로그램은 매우 유사한 구조화 된 내용을 포함하는 셀이있는 UITableViews로 구성되어 있습니다. 공통적 인 내용을 만들었습니다. MyAppTableViewController을 상속 받았으며 UITableViewController을 상속합니다. 내 ' popular'섹션은 PopularTableViewController으로 구성되며 MyAppTableViewController을 상속합니다. 실제 UITableViewMyAppTableViewController 내에 있습니다.

PopularTableViewController 메소드 가지고

- (void) segmentChangeTimeframe:(id)sender { 
    UISegmentedControl *segCtl = sender; 
    if([segCtl selectedSegmentIndex] == 0) 
    { 
     // Call [self parse-xml-method-which-resides-in-MyAppTableViewController] 
    } 
    //... ... ... 
} 

MyAppTableViewControllerNSXMLParser 이용한다을 따라서 코드 가지고

- (void)parserDidEndDocument:(NSXMLParser *)parser { 
    [self.myTableView reloadData]; 
} 

(를 업데이트하는 다른 방법이있다을 테이블 뷰에서 데이터를 가져 오는 데이터 구조)

콘솔 출력 코드를 xml 구문 분석 메서드에 넣었습니다. 실행하면 다른 세그먼트를 선택하면 올바른 xml 파일이 올바르게 구문 분석되고 데이터 구조에 올바른 값이 포함 된 것으로 보입니다.

문제는 표 셀의 내용이 변경되지 않는다는 것입니다. grr! 이상하지 않으면 ... 셀이 보이지 않게 스크롤 된 다음 다시보기로 ... 그 다음에 변경됩니다!

이 문제에 대해 많은 검색을 수행했으며 유사한 문제에 대한 한 가지 제안은 [self.myTableView reloadData]를 자체 메서드에 배치하는 것이 었습니다. 을 myReloadDataMethod 후 사용

[self performSelectorOnMainThread:@selector(myReloadDataMethod) withObject:nil waitUntilDone:NO]; 

내가 parserDidEndDocument 방법으로 위의 코드를 배치 시도하고 전혀 차이를 만들어 없습니다! 나는 절대적으로 곤란을 겪고 있으며 아무도 여기에서 무슨 일이 일어나고 있는지 전혀 궁금해하고 있습니다.

업데이트 :

세포를 채울 수있는 코드로 수행됩니다

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *MyIdentifier = @"MyIdentifier"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:MyIdentifier] autorelease]; 
    } 

    // Set up the cell 
    int itemIndex = [indexPath indexAtPosition: [indexPath length] - 1]; 
    NSString *artistName = [[myItemList objectAtIndex: itemIndex] objectForKey: @"itemA"]; 
    NSString *mixName = [[myItemList objectAtIndex: itemIndex] objectForKey: @"itemB"]; 
    cell.textLabel.text = itemA; 
    cell.detailTextLabel.text = itemB; 
    cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton; 

    return cell; 
} 

위의 코드에 myItemList가있는 곳도 MyAppTableViewController.

+0

당신이 당신의 세포 – Daniel

+0

@Daniel 채우는 데 사용하는 C 송시 게시 - 요청에 따라 나는 질문을 업데이트 한합니다. – IAmFledge

+2

문제와 관련이 없지만 itemIndex를 훨씬 쉽게 가져올 수 있습니다. NSUInteger itemIndex = [indexPath row]. –

답변

5

-performSelectorOnMainThread: 코드는 백그라운드 스레드에서 모델 클래스를 변경할 때 사용됩니다. UI 이벤트 (-reloadData 포함)는 주 스레드에서 발생해야합니다. 백그라운드 스레드를 사용하지 않는다면 이것은 필요하지 않습니다.당신이 있다면, 그것과 같은 것이 필수입니다.

특정 셀의 값을 변경하는 경우 달성 방법은 셀 자체를 변경하는 것입니다. iPhone에서 셀은 전체보기입니다 (Mac과 달리). 데이터를 변경하려면 데이터를 변경하고 -setNeedsDisplay으로 전화하십시오. -cellForRowAtIndexPath:을 사용하여 주어진 위치의 셀 (보기)을 가져올 수 있습니다. -indexPathsForVisibleRows 또는 -visibleCells을 사용하여 주어진 셀이 화면 상에 있는지 확인할 수 있습니다.

-reloadData으로 전화하는 것은 매우 드뭅니다. 모든 것을 버리고 완전히 다른 데이터를로드하는 경우에만 그렇게해야합니다. 대신 삽입/삭제 루틴을 사용하여 행을 추가/제거하고 데이터가 변경 될 때 기존 행의 뷰를 업데이트해야합니다.

+0

안녕하세요. 귀하의 답변에 감사드립니다. 선택된 각 세그먼트 인덱스는 다른 xml 파일 ('오늘'/ '주'/ '월')을 파싱하게하며 기존 셀에 추가되는 것이 아니라 선택한 XML의 내용 만 표시합니다. 이 경우 reloadData를 사용하지 않아야합니까? – IAmFledge

+1

-reloadData이어야합니다. 주 스레드에서 구문 분석 중이거나 백그라운드에서 모델 데이터를 변경하고 있습니까? –

+0

저는 iPhone/ObjC 프로그래밍에 익숙하지 않기 때문에 아이폰 OS가 어떻게 쓰레드를 다루는 지 완전히 모릅니다. (예 : 인터페이스 작성기에서 연결하여 새 스레드가 뒤에서 쫓겨나는지 여부를 알지 못합니다.) 그러나 새 스레드를 명시 적으로 선언하지 않았습니다. 난 그냥 내 AppDelegate 내 UITabBarController * tabBarController 포함되어 있습니다 (어떤 코드가있는, 그것은 그냥 I.B. 연결된) 및 내 컨트롤러 클래스 질문에 설명 된대로. I.B. 내 TabBarController는 각각의 NavigationController에 대한 소유권을 가지고 있습니다. 각각의 소유권은 ... – IAmFledge

0

[tableView setNeedsDisplay:YES]을 사용해 보셨습니까?

1

나는이 같은 문제가 있었는데, 나는 endUpdates 호출없이 [tableView beginUpdates] 호출을했기 때문이었다.

-1

-reloadData를 호출 한 후 tableView에 콜백을 수신합니까? numberOfRowsInSection :? 나는 거의 확신 는, 그 self.myTableView 여기 전무하다 :

- (void)parserDidEndDocument:(NSXMLParser *)parser { 
[self.myTableView reloadData]; 

}

관련 문제