Objective-C: [SectionInfo Nome] de NSFetchedResultSsectionInfo precisa ser informado
-
20-09-2019 - |
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
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