2016-06-29 5 views
0

테이블 뷰 관리를 단순화하기 위해 클래스 집합을 만들었습니다. 그들이 수행하는 작업 중 하나는 데이터가 업데이트되는 부분을 기반으로 섹션에 diff를 작성한 다음 올바른 삽입, 삭제 및 이동을 적용하는 것입니다.insertRowsAtIndexPaths : reloadRowsAtIndexPaths없이 애니메이션을 적용하지 않습니다.

2 개의 비협조적 인 테이블 뷰를 제외하고 이것은 대부분 내 앱에서 훌륭하게 작동합니다. 테이블 A와 테이블 B라고 부르겠습니다. 개별적으로 작동하는 픽스를 발견했지만 동시에 수정할 수는 없습니다. 차이점이 제대로 생성되었는지 확인했지만 어떤 이유로 각기 다른 애니메이션을 얻습니다.

표 A와 표 B는 단순히 행을 삽입하는 것입니다. 삭제 또는 이동이 없습니다.

코드 아래에서

에게 BREAK_TABLE_A 원인 :

  • 표 A - 부 = 0 행의 모든 ​​행> = 1 (되지 = 0 행) 위에서 재 애니메이션 동안 아래쪽으로 이동하기. 아주 추한
  • 표 B - 좋은 삽입 애니메이션

BREAK_TABLE_B 원인 :

  • 표 A - 좋은 삽입 애니메이션
  • 표 B - 아니 애니메이션. 이것이 내가 configureCell를 사용하는 개별 셀에 애니메이션을 수행 할 수있는 즉, 동일한 데이터에 대해 동일한 세포를 유지하기 위해 나를 수 있기 때문에 그냥 궁극적으로 reloadData

처럼, 나는 실제로 BREAK_TABLE_B의 방법을 선호 :.

코드는 비교적 간단합니다 :이 문제를 해결하기 위해

UITableViewRowAnimation animation = UITableViewRowAnimationFade; 
    ... 
    [self.tableView beginUpdates]; 

    NSMutableSet *insertedPaths...; 
    NSMutableSet *deletedPaths...; 
    NSMutableSet *refreshPaths...; // Will contain any cell that was present before and after the update. 

    [self.tableView moveRowsAtIndexPaths:... // Not executed in these examples 
    ... 
    [self.tableView insertRowsAtIndexPaths:insertedPaths.allObjects withRowAnimation:animation]; 
    [self.tableView deleteRowsAtIndexPaths:deletedPaths.allObjects withRowAnimation:animation]; 

    if (BREAK_TABLE_A){ 
     [self.tableView reloadRowsAtIndexPaths:refreshPaths.allObjects withRowAnimation:UITableViewRowAnimationNone]; 
    } else { //BREAK_TABLE_B - I would prefer this solution if possible 
     for (NSIndexPath *path in refreshPaths){ 
      UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:path]; 
      if (cell){ 
       NSUInteger index = [newSection.rows indexOfObjectPassingTest:^BOOL(LQTableViewRow * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { 
        return [obj.rowIdentifier  isEqual:oldSection.rows[path.row].rowIdentifier]; 
       }]; 
       LQTableViewRow *row = newSection.rows[index]; 
       [self configureCell:cell section:newSection row:row]; 
      } 
     } 
    } 

    ... update the actual data source ... 
    [self.tableView endUpdates]; 

, 나는 위의 [CATransaction begin/commit/flush] 코드뿐만 아니라 [UIView begin/commitAnimations] 블록을 포장 시도했습니다. CATransaction은 테이블 B를 사용할 때 (일부 다른 애니메이션을 기다리는 중) 오류없이 앱을 정지시킵니다. UIView 두 뷰 (및 앱의 다른 모든 요소)의 애니메이션이 잘못 재생됩니다 (셀이 페이드 인되어 최종 위치의 맨 아래에서 맨 위로 움직입니다. 테이블 뷰의 맨 위에서 맨 위까지).

나는 또한 같은 이상한 결과로 가능한 한 서로 비슷하게 더미 데이터로보기를로드하려고했습니다.

답변

0

글쎄, CATransaction을 사용할 때의 충돌이 나를 답으로 이끌었다. 트랜잭션을 커밋하는 대신 실수로 두 셀 중 하나에서 [CATransaction begin]을 두 번 수행했습니다. 고정 된 애니메이션을 수정했습니다.

관련 문제