2010-05-06 5 views
0

UINavigationController가 있습니다. 첫 번째 레벨은 UITableViewController이고, 두 번째 레벨은 테이블 뷰의 항목 중 하나에 대한 세부 정보 만 표시합니다.UITableViewController에서 행 삭제 처리

이 상세보기에서 항목을 삭제할 수 있습니다. 기본 관리 오브젝트를 삭제합니다.

다시보기로 돌아 오면 충돌이 있습니다. 데이터가 포함 된 캐시 된 배열을 업데이트하지 않았기 때문에 그 이유가 무엇인지 이해합니다.

여러 자습서를 살펴본 결과 어떻게 삭제해야하는지 정확히 알지 못합니다. 아마도 모델에서 객체를 가져와야하는 위치를 정확히 이해하지 못할 수도 있습니다. 모든 cellForRowAtIndexPath에 대한 쿼리를 수행하고 indexPath.row 위치의 결과에서 항목을 가져와야합니까? 그것은 효율적으로 보이지 않습니다. 어딘가에서 변경 사항을 확인하고 배열에서 전체 쿼리를 다시 캐시해야합니까? 나는 CoreData가 더 자연스러운 것을 제공 할 것이라고 생각하지만 지금까지는 그것을 찾을 수 없었다.

미리 감사드립니다.

답변

2

매우 간단합니다. 하위보기에서는 작업중인 NSManagedObject에 대한 참조가 있어야합니다 (실제로해야합니다).

NSManagedObjectContext *moc = [[self myObject] managedObjectContext]; 
[moc deleteObject:[self myObject]]; 
NSError *error = nil; 
if (![moc save:&error]) { 
    NSLog(@"Save failed: %@\n%@", [error localizedDescription], [error userInfo]); 
} 

이렇게하면 개체가 삭제됩니다. 부모는 NSFetchedResultsController을 사용하고 있기 때문에 (실제로 수행해야하는) 자체 처리됩니다.

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

if (editingStyle == UITableViewCellEditingStyleDelete) { 
    // Delete the managed object at the given index path. 
    NSManagedObject *rowToDelete = [currentRows objectAtIndex:indexPath.row]; 
    [managedObjectContext deleteObject:rowToDelete]; 

    // Commit the change. 
    NSError *error; 
    if (![managedObjectContext save:&error]) { 
     // Handle the error. 
     NSLog(@"Failed to save to data store: %@", [error localizedDescription]); 
     NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey]; 
     if(detailedErrors != nil && [detailedErrors count] > 0) { 
      for(NSError* detailedError in detailedErrors) { 
       NSLog(@" DetailedError: %@", [detailedError userInfo]); 
      } 
     } 
     else { 
      NSLog(@" %@", [error userInfo]); 
     } 
    } 

    // Update the array and table view. 
    [currentRows removeObjectAtIndex:indexPath.row]; 
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES]; 
} 

}

currentRows 당신이 테이블에 표시되는 개체의 NSArray를이다 : 당신이 NSFetchedResultsController를 사용하지 않는 경우

+0

을 살펴볼 수 있습니다. 감사합니다.이 코드는 정말 깨끗합니다. 문제가 해결되었습니다. – Kamchatka

1

세부 컨트롤러에서 상위 컨트롤러의 항목을 삭제하는 것은 다소 비표준적인 것처럼 보이지만, 아마도 귀하의 경우에는 의미가 있습니다. 나는 당신이 tableview에서 항목을 직접 삭제할 수 있다는 것을 알고 있다고 가정합니다. Apple의 많은 예제 코드 프로젝트가 있으며 문서와 함께 어떻게 할 것인지 아이디어를 제공해야합니다.

당신의 질문에 답하기 위해, 당신은 세부 컨트롤러의 클래스에 tableview 컨트롤러에 대한 참조를 가지고있는 속성/변수를 생성 한 다음 그 컨트롤러에 메시지를 보내어 삭제를 처리 할 수 ​​있습니다. 이것을위한 프로토콜을 만드는 것은 좋은 스타일이지만 반드시 필요한 것은 아닙니다. tableview 클래스가 항목 삭제 메시지를 받으면 배열을 업데이트하고 해당 뷰를 다시 표시하면 tableview에서 reloadData을 호출해야합니다. 이는 표준 패러다임입니다. 기본 데이터 모델을 변경하고 tablview에 다시로드하도록 지시하십시오.

+0

종종 하위보기에서 항목을 삭제할 수 있습니다. 예를 들어 메일 응용 프로그램에서는 tableview뿐만 아니라 detail view에서도 삭제할 수 있습니다. reloadData에 대해 궁금한데, 내 테이블 뷰에 엄청난 양의 데이터가 포함되어 있다면 어떻게됩니까? (이 경우는 아니지만 모범 사례를 알고 싶습니다.) 하나의 개체 만 전체 모델을 다시로드하는 것이 좋지 않습니까? 실종 됐어? – Kamchatka

+0

또한 UITableView의 -deleteRowsAtIndexPaths : withRowAnimation : –

1

는, 당신이 오직 할 필요가있는 다음과 같은 방법을 구현한다.

건배