Цель-С:[имяsectionInfo] NSFetchedResultsSectionInfo должно иметь формат даты

StackOverflow https://stackoverflow.com/questions/1943135

Вопрос

У меня есть следующий код:

   -(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 в качестве руководства я отлаживал свой код, пока не убедился, что переменная соответствует входящей строке

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top