uitableview - Sorting with NSFetchedResultsController -
using xcode 4.6, ios6, coredata, uitableviewcontroller, nsfetchesresultscontroller
i figured out how following dates in nsdate variables:
todaydate yesterdaydate thisweek lastweek thismonth lastmonth lastyear now use nsfetchedresultscontroller put data sections based on data in above variables. i'm assuming have date compare:
if ([date1 compare:date2] == nsordereddescending) { nslog(@"date1 later date2"); } else if ([date1 compare:date2] == nsorderedascending) { nslog(@"date1 earlier date2"); } else { nslog(@"dates same"); } there possibility users not have of sections. so, need put in following method determine number of sections based on fetchrequest:
- (nsinteger)numberofsectionsintableview:(uitableview *)tableview i need know how divide data cells numberofrowsinsection: , have displayed cells cellforrowatindexpath:
some code examples nice! thanks.
edit
i haven't integrated controller yet, below code fetch:
- (void) refreshtable { nsfetchrequest *fetchrequest = [[nsfetchrequest alloc] init]; nsentitydescription *entity = [nsentitydescription entityforname:@"meeting" inmanagedobjectcontext:self.managedobjectcontext]; [fetchrequest setentity:entity]; nssortdescriptor *sortdescriptor = [[nssortdescriptor alloc] initwithkey:@"lastmoddate" ascending:no]; nsarray *sortdescriptors = [nsarray arraywithobjects:sortdescriptor, nil]; [fetchrequest setsortdescriptors:sortdescriptors]; [self.managedobjectcontext executefetchrequest:fetchrequest onsuccess:^(nsarray *results) { [self.refreshcontrol endrefreshing]; self.objects = results; [self.tableview reloaddata]; } onfailure:^(nserror *error) { [self.refreshcontrol endrefreshing]; nslog(@"an error %@, %@", error, [error userinfo]); }]; here how i'm getting dates:
nscalendar *cal = [nscalendar currentcalendar]; nsdatecomponents *components = [cal components:( nshourcalendarunit | nsminutecalendarunit | nssecondcalendarunit ) fromdate:[[nsdate alloc] init]]; [components sethour:-[components hour]]; [components setminute:-[components minute]]; [components setsecond:-[components second]]; nsdate *today = [cal datebyaddingcomponents:components todate:[[nsdate alloc] init] options:0]; //this variable should pointing @ date object start of today (midnight); [components sethour:-24]; [components setminute:0]; [components setsecond:0]; nsdate *yesterday = [cal datebyaddingcomponents:components todate: today options:0]; components = [cal components:nsweekdaycalendarunit | nsyearcalendarunit | nsmonthcalendarunit | nsdaycalendarunit fromdate:[[nsdate alloc] init]]; [components setday:([components day] - ([components weekday] - 1))]; nsdate *thisweek = [cal datefromcomponents:components]; [components setday:([components day] - 7)]; nsdate *lastweek = [cal datefromcomponents:components]; [components setday:([components day] - ([components day] -1))]; nsdate *thismonth = [cal datefromcomponents:components]; [components setmonth:([components month] - 1)]; nsdate *lastmonth = [cal datefromcomponents:components];
this do. create core data model , 'user' entity within model. assume u know how this, if u dont comment , ill explain. create custom class ur entity other entity , give lastmoddate nsdate attribute, plus add creationdate attribute equal exact date , time of creating entity can use identifier each userentity. have have array of separate arrays each section want create in uitableview. when add user entity model, set attributes, , because said users might not have every variable, set variable user entity doesn't need nil. when initialize arrays add user entities have appropriate attributes set value. finally, when implement -(nsinteger)numberofsectionsintableview:(uitableview *)tableview have count arrays.
here should like:
im going call entity represents each user 'userentity' (its nsmanagedobject s class have same name).
the following code goes in header of ever class going use create , fetch entities - same class using display uitableview.
@interface class : uitableviewcontroller { nsmanagedobjectcontext *managedobjectcontext; nsmutablearray *arrayofarrays; } @property (retain, nonatomic) nsmanagedobjectcontext *managedobjectcontext; @property (retain, nonatomic) nsmutablearray *arrayofarrays; the following code goes in implementation of ever class going use create , fetch entities - same class using display uitableview.
//for adding userentity model (core data database) , setting attributes
- (userentity *)adduserentitytomodel { userentity *myent = (userentity *)[nsentitydescription insertnewobjectforentityforname:@"userentity" inmanagedobjectcontext:self.managedobjectcontext]; myent.creationdate = [nsdate date]; myent. lastmoddate = ...; //replace '...' date //add other values appropriate attributes here, attributes not //pertain userentity ignore - automatically set default when //are created. nserror *error = nil; if(!managedobjectcontext) nslog(@"managedobejctcontext problem @ ..."); else if (![managedobjectcontext save:&error]) { nslog(@"context not saved!");; } else nslog(@"context saved."); } //for getting userentity's
- (nsmutablearray *)getfetcharray { nsfetchrequest *request = [[nsfetchrequest alloc] init]; if(!managedobjectcontext) { nslog(@"there no managedobjectcontext @ getfetcharray"); } nsentitydescription *entity = [nsentitydescription entityforname:@"userentity" inmanagedobjectcontext:managedobjectcontext]; [request setentity:entity]; nssortdescriptor *sortdescriptor = [[nssortdescriptor alloc] initwithkey:@"creationdate" ascending:no]; nsarray *sortdescriptors = [[nsarray alloc] initwithobjects:sortdescriptor, nil]; [request setsortdescriptors:sortdescriptors]; [sortdescriptors release]; [sortdescriptor release]; nserror *error = nil; nsmutablearray *mutablefetchresults = [[managedobjectcontext executefetchrequest:request error:&error] mutablecopy]; if (mutablefetchresults == nil) { nslog(@"mutablefetchresults array nil"); } [request release]; return mutablefetchresults; } //setting arrayofarrays
-(void)createarrayofarrays { nsmutablearray *fetcharray = [self getfetcharray]; nsmutablearray *todaydatearray = [[nsmutablearray alloc] init]; nsmutablearray *yesterdaydatearray = [[nsmutablearray alloc] init]; nsmutablearray *thisweekarray = [[nsmutablearray alloc] init]; //... create array each section want (userentity *ue in fetcharray) { if(ue.lastmoddate) { //if attribute not nil if(ue.lastmoddate isequal todaydate) [todaydatearray insertobject:ue atindex:0]; else if (ue.lastmoddate isequal yesterdaydate) [yesterdaydatearray insertobject:ue atindex:0]; // ... every section array } } arrayofarrays = [[nsmutablearray alloc] initwithobjects:todaydatearray,yesterdaydatearray,...(the rest of arrays created each attribute), nil] [todaydatearray release]; [yesterdaydatearray release]; // ... release arrays except arrayofarrays , fetcharray } //setting managedobjectcontext
- (id)init { self = [super init]; if (self) { appdelegate *appdelegate = [[uiapplication sharedapplication] delegate];//what ever //the name of appdel is. nsmanagedobjectcontext *context = [appdelegate managedobjectcontext]; self.managedobjectcontext = context; [self createarrayofarrays];//this first creates arrayofarrays , set //equal that's saved in database. if add entity need update //it. } return self; } - (nsinteger)numberofsectionsintableview:(uitableview *)tableview { // return number of sections. return arrayofarrays.count; } - (nsinteger)tableview:(uitableview *)tableview numberofrowsinsection:(nsinteger)section { // return number of rows in section. return [[arrayofarrays objectatindex:section] count]; } //then displaying cells in table view
- (uitableviewcell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath { static nsstring *cellidentifier = @"cell"; uitableviewcell *cell = [tableview dequeuereusablecellwithidentifier:cellidentifier]; if (!cell) { cell = [[[uitableviewcell alloc] initwithstyle:uitableviewcellstylesubtitle reuseidentifier:cellidentifier] autorelease]; } userentity *ent = (userentity *)[[arrayofarrays objectatindex:indexpath.section] objectatindex:indexpath.row]; cell.accessorytype = uitableviewcellaccessorybasic; if(ent.lastmoddate) { //if lastmoddate not nil cell.textlabel.text = ent. lastmoddate; } else { nslog(@"lastmoddate nil @ tableview: cellforrowatindexpath"); } nslog(@"tableview: cellforrowatindexpath called."); return cell; }
Comments
Post a Comment