Pergunta

Eu tenho o seguinte código:

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

Estou basicamente precisando converter o titleForHeaderInsection, que é uma data de string como "2009-12-04 00:00:00 +1100" em uma corda mais agradável. Então, tentei convertê -lo usando algo como DateFormatter SetDateStyle, mas quando eu produzi o NSLog para console, recebo o seguinte:

2009-12-22 09: 42: 10.156 App [94614: 207] Seção 2009-12-04 00:00:00 +1100 2009-12-22 09: 42: 10.157 App [94614: 207

Obviamente, o condenado não está recebendo nada, mas [o nome da seção] deve ser uma string. Eu o analisei em sua própria variável NSString, então por que não posso implementar o DateFormatter?


Um pouco mais de informação: analiso a data entre outras coisas anteriormente, com o snippet de código:

   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];

Agora, quando eu depurar isso, essencialmente a corda crua é "SAT, 27 de novembro de 2009 17:16:00 -800", mas quando olho para o condenado, ele sai para ser "2009-11-27 00:00:00 + 1100 ". Não sei por que, mas, de qualquer forma, é isso que é armazenado. Eu teria pensado que corresponderia ao estilo que mencionei; portanto, se eu alterar o formato DateFormatter para qualquer outro tipo, ele encheria e condenaria se tornar nulo.

Olhando para o meu pós -controlador: tenho alguns trechos de interesse:

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

}

Espero classificar por data e no meu código, no titleForHeaderInsection, formate minha data de string para parecer mais apresentável.

Obrigado rapazes

Foi útil?

Solução

A razão pela qual você estava recebendo comportamento inesperado é porque, durante a análise, você estava definindo o formato da data para

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

O que não tem informações de tempo, e é por isso que houve uma diferença de tempo nas datas.

Além disso, durante a análise, você estava configurando convDate com

NSDate *convDate = [dateFormatter dateFromString:string];

que está armazenando um nsdate e crucialmente NSFetchResultScontroller está chamando o description seletor on convDate Porque não é uma NSString.

Não sei ao certo por que o nsdateformatter não conseguiu reconhecer o formato de data da ISO.

Outras dicas

O motivo pelo qual seu código não funciona é porque

[sectionInfo name]

Retorna um objeto NSString, não um objeto nsdate, que é exigido por

[dateFormatter stringFromDate:];

Você não pode simplesmente lançar uma NSString para um nsdate.

Em vez de,

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

Além disso, não funda um objeto, a menos que haja um motivo específico para fazê -lo.

Eu encontrei a solução indo para http://iosdevelotips.com/cocoa/date-formatters-examples-take-2.html e usando http://unicode.org/reports/tr35/#date_format_patterns Como guia, depurei meu código até garantir que a variável fosse combinada com a string de entrada

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top