2013-04-01 4 views
1

나는 coredata에서 데이터를 검색하여 tableview에 표시하고 있습니다. 사용자가 행을 클릭하면 다른보기 (예 :보기 2)로 이동합니다.tableview 및 coredata에서 행 삭제

이제 Coredata에서뿐만 아니라 Tableview에서 행을 삭제하려고합니다. 나는 행을 삭제할 수있는 코드를 사용했습니다. 그러나 2시에 돌아와서 기록이 다시 돌아옵니다. (그것 coredata에서 삭제지고 있지만 행과 그 데이터는 내가보기를 다시로드 할 때까지 여전히 거기에 있습니다).

이것은 내가 사용한 코드입니다. 귀하의 요구 사항

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

    if (editingStyle == UITableViewCellEditingStyleDelete) { 

     NSManagedObject *selectedOrder = [selectedOrderArray objectAtIndex:indexPath.row]; 
     Order *orderInstance = (Order *) selectedOrder; 
     numberOfRows = [[orderInstance.detailRelation allObjects]count]; 

     NSString *deletedItem; 

     deletedItem = (orderInstance.optionName == nil) ? [[NSString alloc]initWithFormat:@"%@ deleted successfully",orderInstance.menuName] : [[NSString alloc]initWithFormat:@"%@ %@ deleted successfully",orderInstance.optionName , orderInstance.menuName]; 

     [self.managedObjectContext deleteObject:selectedOrder];   
     if([self performSaveInMemoryObjectContext:self.managedObjectContext]){ 

      // [self.tableview reloadData]; 
      [common ShowAlert:deletedItem andMessage:@""]; 
      [selectedOrderArray removeObjectAtIndex:indexPath.row]; 

     } 
     [self fetchRecords]; 
    // NSLog(@"count... %d",[selectedOrderArray count]); 
     [tableview reloadData]; 

    } 
} 

답변

1

에 따라

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (editingStyle == UITableViewCellEditingStyleDelete) 
    { 
     NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext]; 
     [context deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]]; 
     NSError *error; 
     if (![context save:&error]) 
     { 
      UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"App" message:@"Sorry the Item Cannot be deleted" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil]; 
      [alertView show]; 
      [alertView release]; 
     } 
    } 
} 
+0

데이터를 삭제했지만, 행 및 액세서리 타입이 표시된다. – Chandu

+0

을 한 번 삭제 한 후 다시 가져 와서 tableView를 새 데이터로 다시로드하십시오. – Vedchi

+0

나는 그것을했고 슬쩍 스 와이프 now.but 내가 모든 행이 작은 마이너스 symbol.if 내가 거기에 삭제를 탭 거기서 붙어있는 편집 버튼을 클릭하면 작동합니다. (충돌이 아님). – Chandu

0

변화 테이블 및 세부 관계는

if (editingStyle == UITableViewCellEditingStyleDelete) 
    { 
    NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext]; 
    [context deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]]; 
    NSError *error; 
    if (![context save:&error]) 
    { 
     UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"Xpense Tracker" message:@"Sorry the Item Cannot be deleted" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil]; 
     [alertView show]; 
     alertView release]; 
    } 
    [YOURTABLEVIEW reloadData]; 
    } 

편집, 한 번 삭제 reloadData으로 시도 유무 : 지금 잘 작동한다. 이 방법을 삭제 한 후 저장

Step 1: 

@interface ViewController : UIViewController <UITableViewDataSource,UITableViewDelegate,NSFetchedResultsControllerDelegate> 

Step 2: 

update your 
-(NSFetchedResultsController *)fetchedResultsController{ 
self.fetchedResultsController.delegate = self; // with this 
} 

step 3: 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section]; 
    return [sectionInfo numberOfObjects]; 
} 

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

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (editingStyle == UITableViewCellEditingStyleDelete) 
    { 
     NSManagedObjectContext * context = [self.fetchedResultsController managedObjectContext]; 
     [context deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]]; 
     NSError * error; 
     if (![context save:&error]) 
     { 
      NSLog(@"Deletion Error"); 
     } 
    } 

} 

Step 4: 

include NSFetchedResultsControllerDelegate method 
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { 
    [YOURTABLEVIEW reloadData]; 
} 
1

NSManagedObjectContext 필요성을보십시오. 이와

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
    if (editingStyle == UITableViewCellEditingStyleDelete) { 
     NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext]; 
     [context deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]]; 
     NSError *error; 
     [context save:&error] //add this line 

     if (![context save:&error]) { 
      UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"Xpense Tracker" message:@"Sorry the Item Cannot be deleted" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil]; 
      [alertView show]; 
      [alertView release]; 

     } 
    } 

    } 

체크 ..

+0

작동하지 않습니다. – Chandu

+0

보기를 다시로드하면 완벽하게 표시됩니다 .. ..? 그래서 핵심 데이터에서 객체를 성공적으로 삭제했습니다. 어떻게 view2로 돌아 왔습니까? view2로 돌아 왔습니까? superview에서 remove를 사용하면 custom delegate을 넣고 테이블보기를 새로 고침해야합니다. – wesley

+0

view1에 있으면 삭제가 정상적으로 작동하지만 2를보고 다음으로 이동하면됩니다. 다시보기 1 다음 그 working.i 오전 supert.i에서 제거를 사용하여 오전 그냥 기본 탐색 컨트롤러를 사용하고 있습니다. – Chandu

관련 문제