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!

http://www.raywenderlich.com/14742/core-data-on-ios-5-tutorial-how-to-work-with-relations-and-predicates

this post on stackoverflow covers basics of @synthesize.

what @synthesize do?


Comments

Popular posts from this blog

shopping cart - Page redirect not working PHP -

php - How to modify a menu to show sub-menus -

python - Installing PyDev in eclipse is failed -