2010-04-13 2 views
0

핵심 데이터가있는 테이블 뷰에 새 항목을 추가하는 데 문제가 있습니다. 여기 내 코드의 간단한 논리가 있습니다. 내의 ViewController 클래스에서 내가 편집 모드 trigle 할 수있는 버튼이 있습니다 코드이 블록에서데이터 소스로 UITableView 및 Core Data에 새 항목을 추가 하시겠습니까?

- (void) toggleEditing { 
    UITableView *tv = (UITableView *)self.view; 
    if (isEdit) // class level flag for editing 
    { 
    self.newEntity = [NSEntityDescription insertNewObjectForEntityName:@"entity1" 
     inManagedObjectContext:managedObjectContext]; 
    NSArray *insertIndexPaths = [NSArray arrayWithObjects: 
     [NSInextPath indexPathForRow:0 inSection:0], nil]; // empty at beginning so hard code numbers here. 
    [tv insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationFade]; 
    [self.tableView setEditing:YES animated:YES]; // enable editing mode 
    } 
    else { ...} 
} 

를, 내가 먼저 내 현재 관리되는 개체 컨텍스트에 새 항목을 추가하고 난에 새 행을 추가 내 TV. 내 데이터 소스 또는 컨텍스트 내 테이블보기의 행 수의 개체 수 모두 그러나 1

해야한다고 생각 나는 tabView의 경우에 예외를 가지고 : numberOfRowsInSection :

을 잘못된 업데이트 : 섹션 0의 행 수가 잘못되었습니다. 업데이트 (0) 후 기존 섹션에 포함 된 행 수는 업데이트 (0) 이전에 해당 섹션에 포함 된 행 수와 같거나 같아야합니다 해당 섹션에서 삽입 또는 삭제 된 행 수 (삽입 1 개, 삭제 된 0 개)

예외 오른쪽 대리자 이벤트 이후에 제기했다 :

- (NSInteger) tableView:(UITableView *) tableView numberOfRawsInSection:(NSInteger) section { 
    // fetchedResultsController is class member var NSFetchedResultsController 
    id <NSFechedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] 
    objectAtIndex: section]; 
    NSInteger rows = [sectionInfo numberOfObjects]; 
    return rows; 
} 

디버그 모드에서, 나는 행이 여전히 0이고 짝수 toggleEditing의 후 호출 이벤트 것으로 나타났다. fetchedResultsController에서 얻은 sectionInfo에 삽입 된 새 엔티티 객체가 포함되지 않은 것처럼 보입니다. 내가 뭔가를 놓쳤다면 확실하지 않습니까? 어떻게 작동하는지 모르겠습니다 : fetnedResultsController를 알리거나 새로운 엔티티가 현재 관리 객체 컨텍스트에 삽입 될 때 변경 사항을 반영 하시겠습니까?

답변

0

해결책이 있다고 생각합니다. 사실, 나는 toggleEditing 이벤트에서 엔티티를 생성 할 필요가 없다. 그런 다음 삽입 이벤트가 커밋 될 때 엔터티 개체를 만들어야합니다. 여기서하여 toggleEditing 이벤트에서 내 코드의 업데이트입니다 : 이벤트에

- (void) toggleEditing { 
    UITableView *tv = (UITableView *)self.view; 
    if (isEdit) // class level flag for editing 
    { 
    insertRows = 1; // NSInteger value defined in the class or header 
    NSArray *insertIndexPaths = [NSArray arrayWithObjects: 
    [NSInextPath indexPathForRow:0 inSection:0], nil]; // empty at beginning so hard code numbers here. 
    [tv insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationFade]; 
    [self.tableView setEditing:YES animated:YES]; // enable editing mode 
    } 
    else { insertRows = 0; ...} 
} 

, 행 동적으로 현재 테이블 뷰에 삽입됩니다. 대리인이있는 tableView에서 다음

- (NSInteger) tableView:(UITableView *) tableView numberOfRawsInSection:(NSInteger) section { 
    // fetchedResultsController is class member var NSFetchedResultsController 
    id <NSFechedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] 
    objectAtIndex: section]; 
    NSInteger rows = [sectionInfo numberOfObjects]; 
    return rows + insertRows; 
} 

: 새 행이 추가되어 있기 때문에, 다음과 같은 위임에, 나는 절에서 반환되는 행이 선동을 반영하고 있는지 확인해야 numberOfRowsInSection :, 내가 삽입 된 행에 액세서리를 추가 추가로 표시합니다.

이 경험에서 배웠던 교훈은 테이블 뷰에 행이 동적으로 추가되면 관리 대상 개체 컨텍스트에서 엔티티 개체를 만들 필요가 없다는 것입니다. 오브젝트는 편집 스타일을 커밋하기위한 이벤트 (add)에서만 작성됩니다. 기억해야 할 또 다른 중요한 점은 위에서 설명한 것처럼 동적으로 삽입되거나 제거 된 행과 동기화 된 섹션의 행을 추적해야한다는 것입니다.

덧붙여서, 새로운 엔티티 또는 데이터를 추가하는 UI로서 테이블 뷰에 행을 추가하려고 한 이유는 iPhone의 Contact 어플리케이션에 근거하고 있습니다. 새로운 엔티티를 추가하는 가장 일반적인 방법은 탐색 바에 추가 버튼을 표시하는 것이지만 연락처 앱은이를 수행 할 수있는 다른 방법을 제공합니다. 한 사람을 선택하고 탐색 모음에서 편집 단추를 누르면 여러 추가 행이 표보기에서 애니메이션 방식으로 표시됩니다. 내 솔루션이이 목표를 달성하는 올바른 방법인지 확실하지 않습니다. 제발 나를 정정하고 나는 좋은 대답을 받아들이고 싶습니다!

관련 문제