Objective-C: [sectionInfo name] для NSFetchedResultsSectionInfo должно быть dateFormatted - PullRequest
0 голосов
/ 22 декабря 2009

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

   -(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 приложение [94614: 207] convDate (null

Очевидно, что convDate ничего не получает, но [sectionInfo name] должно быть строкой. Я проанализировал его в своей собственной переменной 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];

Теперь, когда я отлаживаю это, по сути, сырой строкой является «Sat, 27 Nov 2009 17:16:00 -800», но когда я смотрю на convDate, она оказывается «2009-11-27 00:00 : 00 + 1100 ". Не уверен, почему, но в любом случае, это то, что хранится. Я бы подумал, что он будет соответствовать стилю, который я упомянул, поэтому, если я изменю формат dateFormatter на любой другой тип, он заполняется, и convDate становится равным nil.

Оглядываясь назад на свой постКонтроллер: У меня есть несколько интересных фрагментов:

- (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 отформатировать строковую дату, чтобы она выглядела более презентабельно.

Спасибо, ребята

Ответы [ 3 ]

1 голос
/ 22 декабря 2009

Причина, по которой вы получили неожиданное поведение, заключается в том, что во время синтаксического анализа вы устанавливали формат даты на

[dateFormatter setDateFormat:@"eee, dd MMM yyyy"];

, у которого нет информации о времени, поэтому во времени была разница во времени.

Кроме того, при разборе вы устанавливали convDate с

NSDate *convDate = [dateFormatter dateFromString:string];

, который хранит NSDate и , критически NSFetchResultsController вызывает селектор description для convDate, потому что это не NSString.

Я не совсем уверен, почему NSDateFormatter не может распознать формат даты ISO.

1 голос
/ 22 декабря 2009

Причина, по которой ваш код не работает, заключается в том, что

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

Кроме того, нельзя автоматически освобождать объект, если для этого нет особой причины.

0 голосов
/ 22 декабря 2009

Я нашел решение, перейдя к http://iosdevelopertips.com/cocoa/date-formatters-examples-take-2.html и используя http://unicode.org/reports/tr35/#Date_Format_Patterns в качестве руководства, я отлаживал свой код, пока не убедился, что переменная соответствует входящей строке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...