4

섹션 헤더와 섹션 인덱스를 채우는 섹션을 생성하는 결과를 가진 NSFetchedResultsController로 UITableViewController를 채우고 있습니다. 섹션 인덱스를 채우기 위해 다음 방법을 사용하고 있습니다.NSFetchedResultsController가 UITableView의 섹션 인덱스를 업데이트하지 않습니다.

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView { 
    return [fetchedResultsController_ sectionIndexTitles]; 
} 

이제 문제가 생겼습니다. NSFetchedResultsController와 관련된 NSManagedObjectContext에 새 요소를 추가하면 새 요소가 저장되고 한 가지를 제외하고는 UITableView의 셀로 적절하게 표시됩니다. UINavigationController의 스택을 띄우고 UITableViewController를 다시로드하지 않으면 새로운 요소가 새 SECTION을 만드는 경우 새 섹션 인덱스가 오른쪽 여백에 표시되지 않습니다.

나는 NSFetchedResultsControllerDelegate의 인터페이스를 본 수동으로이 두 대리자 메서드의 끝에서

[self.tableView reloadSectionIndexTitles]; 

를 호출 한 :

controller:didChangeSection... 
controller:didChangeObject... 

내가 디버깅 방법에 실행을 추적 할 수 있습니다 동안 reload 호출이 호출되면 UITableView의 섹션 인덱스는 섹션 변경 사항을 반영하지 않습니다.

데이터가 다시 나타납니다. 새 섹션은 UITableView에 물리적으로 표시되거나 제거되지만 섹션 인덱스는 업데이트되지 않습니다.

나는 뭔가를 놓친가요?

+0

또 다른 게시물에서 "팀"은 다음과 같이 언급했습니다. "핵심 데이터 지원 테이블 뷰가 테이블 데이터에서 NSFetchedResultsController를 사용하는 경우 테이블 섹션 인덱스를 업데이트하지 않는 3.0 SDK에 알려진 버그가 있습니다 출처." http://stackoverflow.com/questions/994359/update-results-of-nsfetchedresultscontroller-without-a-new-fetch하지만 불행히도 "Simulator - 3.1"을 구축하고있는 것처럼 보입니다. 어쩌면 아직 해결되지 않았을까요? –

답변

7

우리가 가지고있는 버그입니다. 꽤 나쁘게 보일 정도로 코드 라인이 너무 많아 보이는 코드는 http://iphonedevelopment.blogspot.com/2009/11/i-know-youre-tired-of-hearing-about.html을 참조하십시오. 나는이와 함께 갔다 :

- (void)viewWillAppear:(BOOL)animated; { 
    // This is a dumb hack required by this bug: http://iphonedevelopment.blogspot.com/2009/11/i-know-youre-tired-of-hearing-about.html 
    [self.tableView reloadData]; 
} 

그것은 비효율적 일 수 있지만 연 및 데이터의 연을하지 않는 한 아마 어떤 해를하지 않습니다. 그리고 그것은 단지 1 줄의 코드입니다. 따라서 사과가 버그를 수정하면 쉽게 제거 할 수 있습니다.

[self performSelector:(@selector(refreshSectionIndex)) withObject:nil afterDelay:0.2]; 

// ... 

- (void) refreshSectionIndex { 
    [self.tableView reloadSectionIndexTitles]; 
}  

코어 데이터 특히 NSFetchedResultsController이 보인다 :

내가 할 또 다른 것은 (나를 위해 작동, 그것은 당신을 위해 작동 할 것이라는 점을 보장 할 수 없다)
+0

이것은 실제로 작동합니다. 당분간 섹션 색인없이 할 것이지만 연구에 감사드립니다. +1. –

0

[self.tableView endUpdates] 이후 어딘가에 -controllerDidChangeContent: 끝 부분에 넣어보세요.

+0

제안 해 주셔서 감사합니다. 불행히도 그것은 저를 위해 작동하지 않았다. 나는 버그일지도 모르지만 확인하거나 확인하는 방법을 모르겠다. 원래 질문에 추가 한 설명을 참조하십시오. 제안 해 주셔서 감사합니다. –

0

는 예를 들어, 매우 짧은 지연 후에 선택을 수행 할 것입니다 버텍은 대용량 테이블 뷰 업데이트가 가져온 데이터와 동기화되지 않아 응용 프로그램이 손상 될 수 있습니다. Apple이 4.0 SDK의이 프레임 워크에서 버그를 수정하기위한 조치를 취하기를 바랍니다. 그것은 꽤 초조 해.

+1

나는 새로운 요소를 저장 한 후에 이것을 시도했다. 새 요소가 나타납니다. 요소의 새 섹션이 표시되지만 불행히도 새 섹션 색인 제목이 누락되었습니다. 제안에 다시 한 번 감사드립니다. –

+0

이 작업을 원할 경우 뷰 컨트롤러에서 다른 메서드를 만들 필요가 없습니다.이 메서드를 직접 tableView에서 호출 할 수 있습니다. [tv performSelector : @selector (reloadSectionIndexTitles) withObject : nil afterDelay : 0.2];' – zekel

1

이미 2 개월 된 질문이지만 오늘도 같은 문제가 발생했습니다. 그것은 전혀 작동하지 않는 -reloadSectionIndexTitles 것 같다, 그래서 나는 다음과 같은 작품을하는 나를 위해 잠재적 인 해킹의 몇 가지 시도 : 애플이 때문에 해킹의 당신의 앱을 거부 할 경우

@implementation UITableView (JKAdditions) 

- (UIView *)indexView { 
    Class indexClass = NSClassFromString(@"UITableViewIndex"); 
    for(UIView *subview in self.subviews){ 
     if([subview isKindOfClass:indexClass]) return subview; 
    } 
    return nil; 
} 

- (void)reloadSectionIndexTitles { 
    UIView *indexView = [self indexView]; 
    [indexView performSelector:@selector(setTitles:) withObject:[self.dataSource sectionIndexTitlesForTableView:self]]; 
    [indexView setNeedsDisplay]; 
} 

@end 

난 정말 아무 생각이 없지만, 그것은 나를위한 유일한 옵션처럼 보입니다. 전체 테이블을 다시로드하는 것은 모든 종류의 애니메이션 문제를 다루어야하기 때문에 내가 원하는 것만은 아닙니다.

동일한 문제가있는 사용자에게 도움이되기를 바랍니다.

+0

저를 위해 일하지 않았습니다. viewWillAppear에서 실행 했습니까? – pojo

+0

기억하지 못 하겠지만, 어디에서 호출했는지에 관계없이'reloadSectionIndexTitles' 작업을하기위한 해킹 일뿐입니다. 이 답변은 3.5 세이며, iOS 3으로 거슬러 올라갑니다. 그 이후로 많이 변경되었습니다. – Joost

1

Alex Reynolds의 대답과 허용되는 답변을 지연으로 결합하려면 reloadData에 애니메이션 지속 시간에 해당하는 지연 (0.4 또는 0.3 초)으로 전화하십시오.

필자의 경우 지연된 메서드 호출을 컨트롤러 : didChangeSection : atIndex : forChangeType : (핵심 데이터 응용 프로그램)에 고정합니다.

섹션이 추가되거나 삭제되면 데이터가 다시로드 될 때 색인이 업데이트되는 셀의 표준 애니메이션입니다.

나는보기 흉하고 나를 싫어하지만 결과는 괜찮습니다. 나는 또한 애플에게 버그를 제출했다. # 8589547.