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
Post a Comment