NSFetchedResultsController titleForHeaderInSection с отформатированным NSDate

В моем приложении Core Data я использую FetchedResultsController. Обычно, чтобы установить заголовки для заголовков в UITableView, вы должны реализовать следующий метод:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    id <NSFetchedResultsSectionInfo> sectionInfo = [[<#Fetched results controller#> sections] objectAtIndex:section];
    return [sectionInfo name];
}

где [имя sectionInfo] возвращает NSString.

мой sectionKeyPath основан на NSDate, и все это прекрасно работает, за исключением заголовков разделов, которые он мне дает, это необработанные строки описания даты (например, 12/12/2009 12:32:32 +0100), которые выглядят немного беспорядочно в заголовок!

Поэтому я хочу использовать средство форматирования даты, чтобы сделать хороший заголовок, например «17 апреля 2010 г.», но я не могу сделать это с [имя sectionInfo], так как это NSString! Любые идеи?

Огромное спасибо


person Daniel Granger    schedule 17.04.2010    source источник
comment
NSDateFormatter довольно дорог в сборке и выполнении; Я бы сделал это переменной экземпляра вашего табличного представления, чтобы вы не создавали его каждый раз, когда берете заголовок заголовка раздела.   -  person Matthew Crenshaw    schedule 02.07.2015


Ответы (3)


Я нашел решение:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    //Returns the title for each section header. Title is the Date.
    id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
    NSArray *objects = [sectionInfo objects];
    NSManagedObject *managedObject = [objects objectAtIndex:0];
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateStyle:NSDateFormatterMediumStyle];
    NSDate *headerDate = (NSDate *)[managedObject valueForKey:@"itemDate"];
    NSString *headerTitle = [formatter stringFromDate:headerDate];
    [formatter release];
    return headerTitle;
}

Пожалуйста, просмотрите это, если вы знаете лучший способ, пожалуйста, скажите!

В противном случае, если вы застряли с подобной проблемой, я надеюсь, что это поможет!

person Daniel Granger    schedule 17.04.2010

В iOS 4.0 и более поздних версиях используйте метод класса [NSDateFormatter localizedStringFromDate], и ​​вам не придется беспокоиться об управлении экземпляром NSDateFormatter. В противном случае это, кажется, единственный способ сделать это.

person Community    schedule 13.04.2011

Это версия ответа Swift:

override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {        
    let sectionInfo = fetchedResultsController.sections![section]
    let objects = sectionInfo.objects
    if let topRecord:NSManagedObject = objects![0] as? NSManagedObject  {
        let formatter = DateFormatter()
        formatter.dateStyle = .medium
        return formatter.string(from: topRecord.value(forKey: "itemDate") as! Date)
    } else {
        return sectionInfo.indexTitle
    }
}
person Soheil Novinfard    schedule 04.04.2018