2014-12-09 2 views
5

UIViewControllerUITableViewUISegmentedControl이 있고 그 안에 세그먼트가 4 개 있습니다. 사용자가 다른 세그먼트를 두 드릴 때마다 테이블보기에 표시된 셀 유형이 변경되어야합니다. 이렇게하려면 다음 코드가 있습니다.iOS 7.1에서 UITableView가 제대로 다시로드되지 않습니다.

- (IBAction)segmentedControlChanged:(UISegmentedControl *)sender { 
    [self.tableView reloadData]; 
} 

일반적으로 세 번째 세그먼트는 테이블 뷰에 가장 많은 셀을 채 웁니다. 따라서 세 번째 세그먼트에서 테이블의 맨 아래로 스크롤 한 다음 다른 세그먼트로 전환하면 테이블보기에서 해당 셀을 다시로드하고 동일한 스크롤 위치에 머물러있게됩니다. 그러나 헤더보기는 테이블보기가 맨 위로 스크롤되어 화면 아래쪽에 배치 된 것처럼 보입니다. 그런 다음 다시 스크롤을 시작하면 테이블이 아래쪽으로 스크롤되고 셀이 나타나는 것처럼 정상적으로 돌아갑니다.

나는 지금까지이 문제를 해결하기 위해 노력 해왔다. 지금까지 본 모든 게시물은 모두 똑같은 제안을했다. 그들은 애니메이션이 메인 스레드가 아닌 다른 스레드에서 처리된다면 이러한 유형의 문제는 피할 수 없다고 말했다. 그래서 코드를 아래와 같이 수정했습니다 :

- (IBAction)segmentedControlChanged:(UISegmentedControl *)sender { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.tableView reloadData]; 
    }); 
} 

과 : 그들이 일

- (IBAction)segmentedControlChanged:(UISegmentedControl *)sender { 
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{ 
     [self.tableView reloadData]; 
    }]; 
} 

둘의를. 또한 테이블 뷰를 다시로드 할 때 프로그래밍 방식으로 테이블 뷰를 스크롤 해 보았습니다.

누구에게 이런 일이 발생할 수있는 다른 아이디어가 있습니까? 이 문제는 iOS 7.1에서만 발생합니다.

+0

reloadRowsAtIndexPaths : withRowAnimation :? 전체 테이블 대신 하나의 셀만 다시로드 해 보았습니다. –

답변

1

내가 이해하는 것처럼 가장 많은 수의 결과를 가진 세그먼트 제어 인덱스 필터에서 전환 할 때만 문제가 발생합니다.

다시로드 한 후 테이블 뷰를 프로그래밍 방식으로 스크롤하려고하면 세그먼트 컨트롤 1 또는 2에 대한 대상 결과 집합에 대한 인덱스 경로가 무엇인지 계산 했습니까?

예 :

[self.tableView reloadData] 
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:10 inSection:0]; 
[self.tableView scrollToRowAtIndexPath:indexPath 
       atScrollPosition: UITableViewScrollPositionBottom 
         animated:YES]; 

다음은 1 개 섹션이 가정 이상 : 3 (30 개) 기록을 가지고 있으며, 1 10 개 레코드가 어디

것은 우리가 1 segmentedControlIndex 3에서 이동하는 경우.

관련 문제