Цель-С:[имяsectionInfo] NSFetchedResultsSectionInfo должно иметь формат даты
-
20-09-2019 - |
Вопрос
У меня есть следующий код:
-(NSString *)tableView:(UITableView *)table titleForHeaderInSection:(NSInteger)section {
id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
NSString *sectionName = [sectionInfo name];
NSLog(@"sectionName %@", sectionName);
NSString *convDate = [dateFormatter stringFromDate: (NSDate *)sectionName];
NSLog(@"convDate %@", convDate);
return [NSString stringWithFormat:@"%@", [sectionInfo name]];
}
По сути, мне нужно преобразовать заголовок для заголовка, который представляет собой строку даты, например «2009-12-04 00:00:00 +1100», в более красивую более короткую строку.Итак, я попытался преобразовать его, используя что-то вроде dateFormatter setDateStyle, но когда я вывожу NSLog на консоль, я получаю следующее:
2009-12-22 09: 42: 10.156 APP [94614: 207] SectionName 2009-12-04 00:00:00 +1100 2009-12-22 09: 42: 10.157 APP [94614: 207] Convdate (Null
Очевидно, что convDate ничего не получает, но [имяsectionInfo] должно быть строкой.Я проанализировал его в собственную переменную NSString, так почему я не могу реализовать на нем dateFormatter?
Еще немного информации:Ранее я анализировал дату среди прочего, используя фрагмент кода:
if ([currentElement isEqualToString: @"date"]) {
NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init] ;
[dateFormatter setDateFormat:@"eee, dd MMM yyyy"];
NSDate *convDate = [dateFormatter dateFromString:string];
if (self.isComment){
[currentComment setDate: convDate];
}else if (self.isPost)
NSLog(@"convDate is %@", convDate);
[currentPost setDate: convDate];
Теперь, когда я отлаживаю это, по сути, необработанная строка выглядит как «Сб, 27 ноября 2009 г. 17:16:00 -800», но когда я смотрю на convDate, она оказывается «2009-11-27 00:00:00 + 1100".Не знаю почему, но в любом случае именно это и сохраняется.Я думал, что он будет соответствовать упомянутому мной стилю, поэтому, если я изменю формат dateFormatter на любой другой тип, он забьется, и convDate станет нулевым.
Оглядываясь назад на мой постконтроллер:Меня интересуют некоторые фрагменты:
- (NSFetchedResultsController *)fetchedResultsController {
if (fetchedResultsController == nil) {
NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Post" inManagedObjectContext: ApplicationController.sharedInstance.managedObjectContext]];
NSArray *sortDescriptors = nil;
NSString *sectionNameKeyPath = @"date";
NSPredicate *pred = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"(PostSite.name like '%@')", self.site.name]];
[fetchRequest setPredicate:pred];
sortDescriptors = [NSArray arrayWithObject:[[NSSortDescriptor alloc]
initWithKey:@"date" ascending:NO] ];
[fetchRequest setSortDescriptors:sortDescriptors];
fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:
ApplicationController.sharedInstance.managedObjectContext
sectionNameKeyPath:sectionNameKeyPath cacheName:@"PostCache"];
}
return fetchedResultsController;
}
Я надеюсь отсортировать по дате и в своем коде, в titleForHeaderInSection, отформатировать дату строки, чтобы она выглядела более презентабельно.
Спасибо ребята
Решение
Причина неожиданного поведения заключается в том, что во время синтаксического анализа вы установили формат даты на
[dateFormatter setDateFormat:@"eee, dd MMM yyyy"];
который не имеет информации о времени, поэтому в датах была разница во времени.
Кроме того, во время синтаксического анализа вы устанавливали convDate
с
NSDate *convDate = [dateFormatter dateFromString:string];
который хранит NSDate и решающе NSFetchResultsController вызывает description
селектор включен convDate
потому что это не NSString.
Я не совсем понимаю, почему NSDateFormatter не смог распознать формат даты ISO.
Другие советы
Причина, по которой ваш код не работает, заключается в том, что
[sectionInfo name]
возвращает объект NSString, а не объект NSDate, который требуется
[dateFormatter stringFromDate:];
Вы не можете просто привести NSString к NSDate.
Вместо,
- (NSString *)tableView:(UITableView *)table titleForHeaderInSection:(NSInteger)section
{
id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
NSString *sectionName = [sectionInfo name];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
NSString *convDate = [dateFormatter stringFromDate:[dateFormatter dateFromString:sectionName]];
[dateFormatter release];
return convDate;
}
Кроме того, не освобождайте объект автоматически, если для этого нет особой причины.
Я нашел решение, перейдя в http://iosdevelopertips.com/cocoa/date-formatters-examples-take-2.html и использование http://unicode.org/reports/tr35/#Date_Format_Patterns в качестве руководства я отлаживал свой код, пока не убедился, что переменная соответствует входящей строке