2012-06-15 3 views
1

У меня проблема, и мне интересно, можно ли ее решить. У меня есть UITableView, который использует Core Data и NSFetchedResultsController. Большая часть моего приложения - это организация вещей, основанных на датах. В идеале я бы хотел разделить TableView на разделы, основанные на 3 диапазонах дат. Эти диапазоны будут находиться между 2 и 2 днями, между 2 днями и 6 днями и 10 днями и далее. У пользователя есть UIDatePicker, и когда они вводят дату, он будет автоматически помещен в один из этих организованных разделов. Теперь я знаю, как легко разделить табличное представление на разделы по каждой отдельной дате, но не как сделать это, чтобы каждый раздел имел временной диапазон. Спасибо всем, кто может помочь.iOS - UITableView Разделы на основе диапазонов дат

ответ

0

Я бы исследовал использование NSExpressions в запросе выборки. Трудно найти хорошую документацию по использованию SQL-подобных выражений с запросами на выборку; но вы также можете написать свой собственный блок для использования запроса, который является довольно убийцей.

В основном вы хотите, чтобы NSExpression возвращал строку для имени раздела, которую вы можете указать NSFetchedResultsController для использования для пути ключа имени раздела. Вам нужно будет создать NSExpressionDescription вокруг выражения, чтобы добавить его в запрос на выборку.

Я надеюсь, что это ставит вас в правильном направлении!

FWIW, я бы обычно был склонен выполнять SQL-ish-решение (по существу, выбрав выражение «case», которое сравнивает поле даты и выбирает одно из трех значений), но иногда с Core Data, проще просто вытащить (точнее, похоже, что это то, что они хотят от нас).

1

Просто сделал это сам. Конечным результатом является то, что основные объекты данных сортируются по секциям, каждый из которых имеет ширину 1 день. Несколько объектов могут находиться в одном разделе.

//at a point where you define your fetched results controller 
//add @"sectionTitle" as sectionNameKeyPath: 

//... 
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:@"sectionTitle" cacheName:@"CacheName"]; 
//.... 


- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 


    NSString* dateString = [[[self.sleepQualityController sections] objectAtIndex:section] name]; 

    return dateString; 



} 



//add this to your managed object's header file: 
@property(nonatomic,assign)NSString* sectionTitle; 

//this goes into your managed object's implementation file 

-(NSDate *)dateWithOutTime:(NSDate *)datDate 
{ 
    if(datDate == nil) { 
     datDate = [NSDate date]; 
    } 
    NSDateComponents* comps = [[NSCalendar currentCalendar] components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:datDate]; 
    return [[NSCalendar currentCalendar] dateFromComponents:comps]; 

} 

-(NSString*)sectionTitle 
{ 

     NSDateFormatter* dateFormaterWeekdayMonthDay = [[NSDateFormatter alloc] init]; 
     dateFormaterWeekdayMonthDay.dateStyle = NSDateFormatterLongStyle; 

    return [NSString stringWithFormat:@"%@", [dateFormaterWeekdayMonthDay stringFromDate:[self dateWithOutTime:self.date]] ]; 
} 
Смежные вопросы