2013-03-26 2 views
1

이 질문은 전에 물어 보았습니다.하지만, Core Data 프로젝트에서 UITableView 셀을 사용하여 재정렬을 구현하는 방법은 아직도 혼란 스럽습니다. 나는 내 프로젝트에서 TableView 셀을 재정렬하기 위해 사용했다. 재 배열 된 셀은 코어 데이터에 영향을받지 않습니다.어떻게하면 테이블 뷰 셀을 재 배열 한 후 coredata 레코드를 업데이트 할 수 있습니까?

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath 
     toIndexPath:(NSIndexPath *)toIndexPath 
{ 
NSInteger sourceRow = fromIndexPath.row; 
     NSInteger destRow = toIndexPath.row; 
     Question *cat1=[questionsArray objectAtIndex:sourceRow]; 
     [questionsArray removeObjectAtIndex:sourceRow]; 
     [questionsArray insertObject:cat1 atIndex:destRow]; 
     [self.cardsTable setEditing:NO animated: YES]; 
     [cardsTable reloadData]; 
} 

답변

0

먼저 색인을 NSManagedObject에 보관해야합니다.

이 때 당신은 삽입에 새로운 객체는 당신이 당신의 인덱스에 의해 정렬 개체를 가져올 후에는 lastIndex + 1

을 할 인덱스를 설정해야합니다.

셀을 재정렬 할 때도 인덱스를 개체에 설정해야합니다. 색인을 모든 오브젝트로 변경해야 할 수도 있으므로주의하십시오.

예 : 첫 번째 셀을 가져와 마지막 위치로 이동합니다. 이 경우 모든 색인이 변경됩니다. FirstCell은 마지막 인덱스를 사용하고 다른 모든 인덱스는 oldIndex-1을 사용합니다.

데이터 소스 배열을 반복 편집 한 후 객체 인덱스를 반복 인덱스로 설정하면됩니다.

+0

@Alex Terente – VasuIppili

2

iOS 5.0 이상을 타겟팅 할 수 있다면 NSOrderedSet을 사용하여 개체 순서를 유지할 수 있습니다. 이 방법을 사용하는 것이 (Apple의 설명서에 따라) 내가 제안하고있는 다른 방법보다 훨씬 효율적이지 않다는 점에 유의하십시오. 자세한 내용은 Core Data Release Notes for iOS 5을 확인하십시오.

5.0보다 이전 버전의 iOS를 지원해야하거나 훨씬 효율적인 접근 방법을 사용하려면 엔티티에 추가 정수 속성을 생성하고 엔티티 객체의 색인을 수동으로 유지해야합니다 추가되거나 재 배열된다. 개체를 표시 할 시간이되면이 새 특성을 기준으로 개체를 정렬해야하며 모두 설정되어 있어야합니다. 당신이 너무 많은 수작업을 발견하면, 마지막으로

- (void)moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath sortProperty:(NSString*)sortProperty 
{ 
    NSMutableArray *allFRCObjects = [[self.fetchedResultsController fetchedObjects] mutableCopy]; 

    NSManagedObject *sourceObject = [self.fetchedResultsController objectAtIndexPath:sourceIndexPath]; 

    // Remove the object we're moving from the array. 
    [allFRCObjects removeObject:sourceObject]; 
    // Now re-insert it at the destination. 
    [allFRCObjects insertObject:sourceObject atIndex:[destinationIndexPath row]]; 

    // Now update all the orderAttribute values for all objects 
    // (this could be much more optimized, but I left it like this for simplicity) 
    int i = 0; 
    for (NSManagedObject *mo in allFRCObjects) 
    { 
     // orderAttribute is the integer attribute where you store the order 
     [mo setValue:[NSNumber numberWithInt:i++] forKey:@"orderAttribute"]; 
    } 
} 

나는 정말 무료 Sensible TableView 프레임 워크를 사용하는 것이 좋습니다 예를 들어, 다음은 moveRowAtIndexPath 방법은 다음과 같아야 방법이다. 프레임 워크는 자동으로 주문을 관리 할뿐만 아니라 엔티티의 속성 및 다른 엔티티와의 관계를 기반으로 모든 테이블 뷰 셀을 생성합니다. 내 의견으로는 정말 좋은 시간을 절약 할 수 있습니다. 또한 UIOrderedTableView이라는 다른 라이브러리에 대해 알고 있지만 필자는이 라이브러리를 사용하지 않았기 때문에 이전 프레임 워크를 사용하는 것이 좋습니다.