ios - UITableView doesn't refresh when NSPredicate set -
preface: tried [self.tableview reloaddata]. app doesn't crash, doesn't refresh, either.
i'm trying display 2 sets of results on 1 tableviewcontroller depending upon whether nspredicate set. i'm trying find jargon free answer how can update uitableviewcontroller once predicate set.
my data displays when view loads. predicate sets properly, log statements i've thrown in return values...but nothing happens when it's set.
i know startlingly stupid question, i'm dumb figure out. every answer i've found involves uisearchbar, deprecated methods, or snippet of answer, etc.
what i'd display:
1) a vanilla fetchrequest displays everything--this works: in managedobjectcontext set in viewdidload w/o nspredicate.
2) once set nspredicate, i'd update tableview--this doesn't crash, doesn't update tableview
on mytableviewcontroller, have popover instantiates when click uibarbuttonitem on mytableviewcontroller. on popover, set predicate on mytableviewcontroller.
basically, i'd toggle what's displayed , display toggle driven whether variable nil (everything displays) or filtered (variable sets predicate).
i'm either first or dumbest person attempt feat of software engineering. i'll wager latter, given how many times i've seen end-user. if know i'm doing wrong, i'd grateful hear you. thank reading.
i have 2 entities: pointofinterest , locationcategory. have uibarbutton triggers popover of mytableviewcontroller delegate. clicking on popover sets selectedcategory property on mytableviewcontroller.:
// gets set popovertableviewcontroller @property (nonatomic, strong) locationcategory *selectedcategory; // set on `mytableviewcontroller` @property (nonatomic, strong) nspredicate *searchpredicate; the property gets set correctly on mytableviewcontroller. i'm trying use selectedcategory object basis predicate display "filtered" list of 'pointofinterest' objects. left out boilerplate code tvc, i've got tableview delegate methods on tvc.
i think need set fetchedresultscontroller nil , reinstantiate w/ predicate in refreshtableviewcontroller method. doesn't crash, doesn't work, either.
here's viewdidload of mytableviewcontroller:
- (void)viewdidload { [super viewdidload]; appdelegate *appdelegate = [[uiapplication sharedapplication] delegate]; self.managedobjectcontext = appdelegate.managedobjectcontext; // uncomment following line preserve selection between presentations. // self.clearsselectiononviewwillappear = no; nslog(@"savedpoi managedobjectcontext %@", self.managedobjectcontext); // initialize fetch request nsfetchrequest *fetchrequest = [[nsfetchrequest alloc]initwithentityname:@"pointofinterest"]; // add sort descriptors [fetchrequest setsortdescriptors:@[[nssortdescriptor sortdescriptorwithkey:@"name" ascending:yes]]]; // initialize fetched results controller self.fetchedresultscontroller = [[nsfetchedresultscontroller alloc]initwithfetchrequest:fetchrequest managedobjectcontext:self.managedobjectcontext sectionnamekeypath:nil cachename:nil]; // configure fetchedresultscontroller [self.fetchedresultscontroller setdelegate:self]; // perform fetch nserror *error = nil; [self.fetchedresultscontroller performfetch:&error]; if (error) { nslog(@"unable perform fetch"); nslog(@"%@, %@", error, error.localizeddescription); } // sets observer listens when `selectedcategory` set [[nsnotificationcenter defaultcenter]addobserver:self selector:@selector(refreshtableviewcontroller:) name:@"categoryselected" object:nil]; } once selectedcategory set, have following method set run. doesn't crash, doesn't refresh mytableviewcontroller. suspect i've got minor error here, i'm not sure i'm doing wrong.
- (void)refreshtableviewcontroller:(nsnotification *)notification { if ([[notification name]isequaltostring:@"categoryselected"]) { nslog(@"nsnotification on savedpoitableviewcontroller's self.selectedcategory %@", self.selectedcategory.categoryname); // nuke cache loaded in viewdidload [nsfetchedresultscontroller deletecachewithname:@"pointofinterest"]; // nuke fetchedresultscontroller alloc/inited in viewdidload self.fetchedresultscontroller = nil; // alloc init new fetchrequest nsfetchrequest *fetchrequest = [[nsfetchrequest alloc] init]; // set entity nsentitydescription *entity = [nsentitydescription entityforname:@"pointofinterest" inmanagedobjectcontext:self.managedobjectcontext]; [fetchrequest setentity:entity]; // add sort descriptors [fetchrequest setsortdescriptors:@[[nssortdescriptor sortdescriptorwithkey:@"name" ascending:yes]]]; // reinstantiate fetchedresultscontroller self.fetchedresultscontroller = [[nsfetchedresultscontroller alloc]initwithfetchrequest:fetchrequest managedobjectcontext:self.managedobjectcontext sectionnamekeypath:nil cachename:nil]; nsstring *predicatestring = self.selectedcategory.categoryname; nslog(@"predicatestring %@", predicatestring); self.searchpredicate = [nspredicate predicatewithformat:@"locationcategory.categoryname == %@", predicatestring]; nslog(@"self.searchpredicate in refreshtableviewcontroller %@", predicatestring); // fetchrequest predicate [fetchrequest setpredicate:self.searchpredicate]; // perform fetch nserror *error = nil; [self.fetchedresultscontroller performfetch:&error]; if (error) { nslog(@"unable perform fetch"); nslog(@"%@, %@", error, error.localizeddescription); } [self.tableview reloaddata]; } } just completeness' sake, here's pointofinterest & locationcategory classs:
#import <foundation/foundation.h> #import <coredata/coredata.h> @class locationcategory; @interface pointofinterest : nsmanagedobject @property (nonatomic, retain) nsstring * note; @property (nonatomic, retain) nsstring * name; @property (nonatomic, retain) nsstring * address; @property (nonatomic, retain) nsnumber * latitude; @property (nonatomic, retain) nsnumber * longitude; @property (nonatomic, retain) nsstring * phonenumber; @property (nonatomic, retain) nsstring * url; @property (nonatomic, retain) locationcategory *locationcategory; #import <foundation/foundation.h> #import <coredata/coredata.h> @class pointofinterest; @interface locationcategory : nsmanagedobject @property (nonatomic, retain) id categorycolor; @property (nonatomic, retain) nsstring * categoryname; @property (nonatomic, retain) nsset *pointofinterest; @end
i figured out:
i added implementation file on mytableviewcontroller:
@synthesize fetchedresultscontroller = _fetchedresultscontroller; as expected, missing startlingly stupid--and i **right!!
i read post on ray wenderlich's website , noticed had line in implementation, didn't. i've never encountered need use @synthesize , i've seen mentions elsewhere "you never need it", etc. well, turns out, do!
this post on stackoverflow covers basics of @synthesize.
Comments
Post a Comment