问题
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
回答1:
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!
回答2:
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.
回答3:
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
}
}
来源:https://stackoverflow.com/questions/2660105/nsfetchedresultscontroller-titleforheaderinsection-with-formatted-nsdate