2012-07-26 3 views
2

NSFetchedResultsController에서 데이터를 수신하는 UITableView가 있습니다. NSFetchedResultsController의 데이터는 네트워크 호출에 의해 때때로 업데이트됩니다. 네트워크 호출에서 데이터가 업데이트 될 때마다 새 항목을 추가하기 위해 [tableView reloadData]로 UITableView를 업데이트합니다.Reload UITableView UITableViewCells 위치를 변경하지 않고 데이터

또한 내 UI의 일부로 셀의 가로 방향 위치를 변경할 수 있습니다. 테이블의 데이터가 새로 고침 될 때마다 이러한 셀의 위치를 ​​다시 지정하지 못하게하고 싶지만 불행히도 [tableview reloadData]는이를 수행합니다.

행의 위치를 ​​변경하지 않고 테이블 뷰의 데이터를 업데이트하는 가장 좋은 방법은 무엇입니까? 내가 tableview의 reloadData 메소드를 오버라이드하고 거기서 멋진 것을 만들거나 아마도 tableview 셀 layoutSubviews 메소드를 오버라이드해야할까요?

내가 그렇게 같은 셀의 위치를 ​​다음 NSFetched이 컨트롤러는 네트워크 호출에서 더 많은 데이터를 수신 결과 후 그것의 대리인의 메소드를 호출,

CGRect newFrame = cell.frame; 
newFrame.origin.x = -cell.frame.size.width; 
cell.frame = newFrame; 

을 : 의 tableview를 호출

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { 
    [self.eventTableView reloadData]; 
} 

: cellForRowAtIndexPath :과 dequeue에서 반환 된 셀의 원점은 (0,0)

입니다. 0
+0

구체적으로 기재 할 수 있습니까? 아마도 다른 위치를 제안하기가 힘들 기 때문에이 위치 변경이 어떻게 일어나는지에 대한 코드를 게시하십시오. – Dima

+0

@Dima 대부분의 코드는 Apple의'[tableView reloadData]'구현에서 발생하기 때문에 게시 할 코드가별로 없습니다. 프레임을 수정하여 셀을 이동시키고'[tableView reloadData]를 호출하면 [tableView dequeueReusableCellWithIdentifier : CellIdentifier]에서 반환 된 셀의 원점은 (0, 0)입니다. – johnnyman727

+0

더 나은 방법이있을 수 있습니다,하지만 세포에 대한 사용자 정의보기를 만드는 방법에 대한 다음 셀이 업데이 트를 수신하고 자체를 업데이 트합니까? – Brian

답변

0

UITableViewDelegate 메서드 tableView:willDisplayCell:forRowAtIndexPath:을 사용해보십시오.이 메서드는 테이블보기에 셀이 추가되거나 테이블의 보이는 영역으로 스크롤되기 바로 전에 호출됩니다. 거기에서 필요하다면 셀을 배치 할 수 있으며 다시로드 한 후에 작동합니다.

질문에 필수적인 것은 아니지만 프레임 대신 셀의 변형 속성을 변경하는 것이 좋습니다. 그렇게하면 우연히 원하는 방향으로 멀리 이동할 수 없습니다 (두 번 이동하는 경우).

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
    //Determine if the cell should be shifted. 
    if (cellShouldShift) { 
    cell.transform = CGAffineTransformMakeTranslation(0 - cell.bounds.size.width, 0); 
    } else { 
    cell.transform = CGAffineTransformIdentity; 
    } 
} 
+0

이 메소드는 cellForRowAtIndexPath 다음에 호출됩니다.이 시점에서 셀은 이미 원점으로 설정되어 있습니다. 따라서 이전에 세포가 옮겨 졌는지 여부를 안다면 같은 결과를 얻을 수 있습니다. 어려운 부분은 셀을 다시로드하기 전에 이전에 셀을 이동했는지 파악하는 것입니다. 나는 세포에 어떤 종류의 위험한 속성을 유지할 수 있다고 생각하지만 그것은 약간 해킹 된 것처럼 보입니다. – johnnyman727

+0

테이블 뷰를 다시로드하는 대신 필요할 때'insertRowsAtIndexPaths : withRowAnimation :') 행을 삽입하는 것이 가능합니까? 그렇지 않다면 아마 뭔가 해키에 의지해야 할 것입니다. –

+0

네트워크 통화에도 이미 존재하는 셀의 UI를 업데이트하는 정보가 있기 때문에 뭔가 해킹해야 할 것이라고 생각합니다. :( – johnnyman727

관련 문제