2012-06-25 2 views
0

Мое приложение - это что-то вроде журнала. Я продолжаю свидетельство событий, которые происходят в один день. В принципе, у меня есть Entity (отображается в виде таблицы) с атрибутом «date». Когда я сохраняю новое событие, текущая дата сохраняется, используя [NSDate date]. Как мне организовать упорядочение таблицы, чтобы все события сортировались по дням и отображались как таковые? Любые подсказки будут оценены!Названия разделов таблицы TableView

ответ

3

Вы должны использовать параметр sectionNameKeyPath вашего NSFetchedResultsController, чтобы разделить ваши результаты по дате.

Несколько примеров here и here.

Вы по существу установить атрибут, который вы хотите использовать в качестве параметра sectionNameKeyPath, который будет выглядеть следующим образом:

fetchedResultsController = [[NSFetchedResultsController alloc] 
          initWithFetchRequest:fetchRequest 
          managedObjectContext:managedObjectContext 
           sectionNameKeyPath:@"date" 
             cacheName:nil]; 

Затем источник данных код делегат будет выглядеть примерно так:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return [[fetchedResultsController sections] count]; 
} 

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView { 
    return [fetchedResultsController sectionIndexTitles]; 
} 

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index { 
    return [fetchedResultsController sectionForSectionIndexTitle:title atIndex:index]; 
} 

Редактировать: Чтобы группировать элементы по дням, вам нужно будет создать свойство переходного процесса для ваших управляемых объектов - по существу строку даты, полученную с фактической даты.

Они идут в верхней части .h/.m как обычно

@property (nonatomic, strong) NSString *sectionTitle; 

@synthesize sectionTitle; 

Теперь, когда вы создали свойство, вы хотите, чтобы переопределить его аксессор на самом деле настроить название, когда оно запрашивается ,

-(NSString *)sectionTitle 
{ 
    [self willAccessValueForKey:@"date"]; 
    NSString *temp = sectionTitle; 
    [self didAccessValueForKey:@"date"]; 

    if(!temp) 
    { 
     NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
     [formatter setDateFormat:@"d MMMM yyyy"]; // format your section titles however you want 
     temp = [formatter stringFromDate:date]; 
     sectionTitle = temp; 
    } 
    return temp; 
} 

Обратите внимание, что этот код на самом деле проверяет, если sectionTitle уже в кэше и просто повторно использует его без воссоздания. Если вы ожидаете или позволяете изменить дату для прошлых объектов, необходимо также обновить sectionTitle, если это так, вам также необходимо перезаписать мутатор для самой даты и добавить строку для ее очистки sectionTitle (чтобы в следующий раз, когда заголовок был запрошен, он будет воссоздан).

- (void)setDate:(NSDate *)newDate { 

    // If the date changes, the cached section identifier becomes invalid. 
    [self willChangeValueForKey:@"date"]; 
    [self setPrimitiveTimeStamp:newDate]; 
    [self didChangeValueForKey:@"date"]; 

    [self setSectionTitle:nil]; 
} 

И, наконец, вы должны просто изменили sectionNameKeyPath для вашего fetchedResultsController к @"sectionTitle".

У Apple есть sample project, на который вы можете посмотреть, хотите ли вы увидеть что-то подобное в действии.

+0

Спасибо. Теперь я застрял в той части, где есть раздел для каждого объекта, а не сгруппирован. – PonyLand

+0

О, верно! Это связано с тем, что он использует весь объект даты, который содержит фактические часы/минуты/секунды, а не только день. Я добавляю код в конец моего ответа. – Dima

+1

Решил это :) Большое спасибо lolcat! Надеюсь, это будет полезно для будущих noobs, таких как я. – PonyLand

Смежные вопросы