开发者

NSFetchedResultsController titleForHeaderInSection with formatted NSDate

In my Core Data app I am using a FetchedResultsController. Usually to set titles for headers in a UITableView you would implement the following method like so:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
  开发者_高级运维  id <NSFetchedResultsSectionInfo> sectionInfo = [[<#Fetched results controller#> sections] objectAtIndex:section];
    return [sectionInfo name];
}

where [sectionInfo name] returns a NSString.

my sectionKeyPath is based on an NSDate and this all works fine apart from the section headers it gives me are the raw date description strings (e.g. 12/12/2009 12:32:32 +0100) which look a bit of a mess in a header!

So I want to use a date formatter on this to make a nice header like "Apr 17 2010" but I can't do that with the [sectionInfo name] as this is NSString! Any Ideas?

Many Thanks


I found a solution:

- (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;
}

Please look over this, if you know of a better way please say!

Otherwise if your stuck with a similar problem I hope this helps!


In iOS 4.0 and later, use the [NSDateFormatter localizedStringFromDate] class method and you won't have to worry about managing the NSDateFormatter instance. Otherwise this seems to be the only way to do it.


This is the Swift version of the answer:

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
    }
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜