2010-12-08 4 views
12

UITableView에서 행의 삭제 및 순서 변경을 관리하는 방법에 대한 설명서를 읽었습니다. 수정 버튼을 만들었고 행을 삭제할 수 있습니다. 나는 사용자가 행을 재정렬 할 수 있기를 바랍니다. 그것은 단순 해 보이지만 세포를 움직일 수 있다고 말하는 방법을 이해할 수는 없습니다.삭제 버튼을 사용하여 UITableView에서 재정렬 컨트롤을 표시하는 방법

삭제할 수있는 행을 알려면 editingStyleForRowAtIndexPath를 사용합니다. 그러나 셀을 이동할 수도 있고 어디에서 showsReorderControl을 설정해야합니까? cellForRowAtIndexPath에 배치하려했지만 아무 것도 표시되지 않았습니다.

감사합니다.

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath 

Table View Programming Guide for iOS

답변

32

당신은 행이 이동 될 수 있다는 말을 위의 대답. 모델이 변경 가능한 배열이 일어나는 경우이 같은이있는 tableView에 대한 충분 : moveRowAtIndexPath : toIndexPath을 :

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath 
{ 
    id objectToMove = [_objects objectAtIndex:fromIndexPath.row]; 
    [_objects removeObjectAtIndex:fromIndexPath.row]; 
    [_objects insertObject:objectToMove atIndex:toIndexPath.row];  
    [tableView reloadData]; 
    [self saveObjects]; // A method of your own to make new positions persistent 
} 
+0

을 무시할 경우 [슈퍼 layoutSubviews] T의 그 전화 그는 내가 읽고있는 문서 다. 나는 이미 그 방법을 정확히 구현했다. 그러나 아직도 나는 아무것도 움직일 수 없다. 난 그냥 행을 삭제할 수 있습니다. –

+0

내 응용 프로그램에서 작동합니다 ... 코드를 게시하십시오 ... –

+4

오, 죄송 합니다만, 나는 moveRowAtIndexPath를 구현하는 것이 필수적이라는 것을 알았습니다. 데이터 소스를 수정하는 것만으로 충분하다고 생각했습니다. 감사! –

2

Managing the Reordering of Rows이 @benoit에 추가 참조 : 데이터 소스를 업데이트

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return YES; 
} 

을이 대리자를 구현합니다

1

이 시도. . .this는 재주문을 볼 수 없습니다 여전히 애플의 문서에서 여기에 대한 답변에서 언급 한 바와 같이 내가 필요한 모든 UITableViewDelegate 방법을 구현 한

내 경우
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return YES; 
} 

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath 
{ 
    [tableData insertObject: [tableData objectAtIndex:sourceIndexPath.row] atIndex:destinationIndexPath.row]; 
    [tableData removeObjectAtIndex:(sourceIndexPath.row + 1)]; 
} 
4

간단한의 tableview의 경우 배열과 세포의 갱신 처리 만합니다 제어. 결국 슈퍼의 기본 구현을 호출하지 않고 layoutSubviews 메서드를 오버라이드했기 때문에 결과가 나왔다. [super layoutSubviews]를 추가하고 나면 재정렬 컨트롤이 마침내 나타납니다.

우리가 [super layoutSubviews]를 호출해야하는 이유는 테이블의 편집 속성을 토글 할 때 셀의 layoutSubviews 메서드를 호출하고 재정렬 컨트롤과 같은 시스템 제공 컨트롤이 UITableViewCell의 기본 layoutSubviews 메서드 내에 표시되기 때문입니다. 이 사실을 깨닫게되면, 레이아웃 순서 컨트롤이 나타날 때 편집하기 쉽거나 안되지 않게 셀의 모양을 변경하기 위해 layoutSubviews 구현을 수정할 수도 있습니다. canMoveRowAtIndexPath하고있는 tableView : moveRowAtIndexPath : toIndexPath

  • 가 YES 확인있는 tableView의 편집 속성이 설정되어
  • 을 구현

    1. 가 대리자 메서드를 tableView가 있는지 확인하십시오

      그래서 여기가 행 재 배열을위한 체크리스트입니다 사용자 정의있는 UITableViewCell이있는 경우

    2. 있는지 확인 당신은 당신이이 방법
    관련 문제