How to delete row from UITableView using NSFetchedResultsController with NSPredicate? -


viewcontroller displays uitableview using nsfetchedresultscontroller access core data (sqlite). user can swipe , delete, added items displayed. expected.

when uisearchbar used filter rows, replaces nsfetchedresultscontroller new instance. same same except nspredicate representing user input set nsfetchrequest

all still until user swipes delete row. commiteditingstyle raised , object deleted. didchangeobject raised , deleterowsatindexpaths method executed time row not removed.

things start go pear shaped after that. if user attempts delete row again, app throws

*** terminating app due uncaught exception 'nsrangeexception', reason: '*** -[__nsarraym objectatindex:]: index 0 beyond bounds empty array' ***

so tableview believes there no object @ index visible, otherwise user not able raise commiteditingstyle method.

how deleterowsatindexpaths visually remove row?

thanks rob

- (void) tableview:(uitableview *) tableview commiteditingstyle:(uitableviewcelleditingstyle) editingstyle forrowatindexpath:(nsindexpath *) indexpath {     if (editingstyle == uitableviewcelleditingstyledelete) {          nsmanagedobject *objecttodelete = [fetchedresultscontroller objectatindexpath:indexpath];         [moc deleteobject:objecttodelete];         [moc save:nil];         [self savedata];      } }   - (void) savedata {     nserror *error = nil;     [moc save:&error];     if(kglobalrunlogging && error)          nslog(@"failed save data") ; }  - (void) controller:(nsfetchedresultscontroller *) controller didchangeobject:(id) anobject    atindexpath:(nsindexpath *) indexpath forchangetype:(nsfetchedresultschangetype) type newindexpath:(nsindexpath *) newindexpath  {      switch(type) {          case nsfetchedresultschangeupdate:             //boring cell formatting stuff             break;          case nsfetchedresultschangedelete:              [self.tableview deleterowsatindexpaths:[nsarray arraywithobject:indexpath] withrowanimation:uitableviewrowanimationfade];              break;       }  } 

and method returns nsfetchedresultscontroller

 - (nsfetchedresultscontroller *) fetchedresultscontrollerwithpredicate:(nspredicate *) apredicate  {     nsfetchrequest *request = [[nsfetchrequest alloc] init];     [request setentity:[nsentitydescription entityforname:@"product" inmanagedobjectcontext:moc]];      [request setpredicate:apredicate];      nssortdescriptor *namesdescriptor = [[nssortdescriptor alloc] initwithkey:@"initial" ascending:yes];     [request setsortdescriptors:[nsarray arraywithobjects:namesdescriptor, nil]];      nsstring *cachename = @"root";     if(apredicate) cachename = nil;      nsfetchedresultscontroller *afetchedresultscontroller = [[nsfetchedresultscontroller alloc] initwithfetchrequest:request managedobjectcontext:moc sectionnamekeypath:@"initial" cachename:cachename];      afetchedresultscontroller.delegate = self;      nserror *anyerror = nil;     if (![afetchedresultscontroller performfetch:&anyerror]) {         nslog(@"error fetching: %@", anyerror) ;     }      return afetchedresultscontroller;   } 


Comments