0

J'ai le code suivant:Objective-C: [nom sectionInfo] de NSFetchedResultsSectionInfo doit être dateFormatted

Je suis besoin essentiellement pour convertir le titleforheaderinsection qui est une date de chaîne comme « 2009-12-04 00:00:00 +1100 "pour une plus belle chaîne plus courte. J'ai donc essayé de le convertir en utilisant quelque chose comme dateFormatter setDateStyle, mais quand j'ai sorti le NSLog en console, j'ai obtenu ce qui suit:

2009-12-22 09: 42: 10.156 app [94614: 207] sectionNom 2009-12- 04 00:00:00 +1100 2009-12-22 09: 42: 10.157 app [94614: 207] convDate (null

De toute évidence, convDate n'obtient rien, mais [sectionInfo name] doit être une chaîne. Je l'ai analysé dans sa propre variable NSString, alors pourquoi je ne peux pas mettre en œuvre la DateFormatter sur elle


Un peu plus d'informations: la date que je parse parmi ot ses choses plus tôt, avec l'extrait de code être:

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

Maintenant, quand je le débugger, essentiellement la chaîne brute est « Sam, 27 novembre 2009 17:16:00 -800 » mais quand je regarde la convDate il sort pour être "2009-11-27 00:00:00 +1100". Je ne sais pas pourquoi, mais en tout cas, c'est ce qui est stocké. J'aurais pensé que cela correspondrait au style que j'ai mentionné, donc si je change le format de dateFormatter à n'importe quel autre type, il se bourrerait et convDate deviendrait nul.

En regardant ma PostController: J'ai quelques extraits d'intérêt:

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

}

J'espère trier par date, et dans mon code, en titleForHeaderInSection, formatez ma date de chaîne avoir l'air plus présentable.

Merci les gars

Répondre

1

La raison pour laquelle vous obtenez un comportement inattendu est parce que pendant l'analyse syntaxique vous définissez le format de date à

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

qui n'a pas d'informations de temps, ce qui est la raison pour laquelle il y avait une différence de temps dans les dates.

De plus, lors de votre analyse syntaxique établissiez convDate avec

NSDate *convDate = [dateFormatter dateFromString:string]; 

qui stocke un NSDate et cruciale NSFetchResultsController appelle le sélecteur description sur convDate parce qu'il est pas un NSString.

Je ne suis pas entièrement sûr pourquoi NSDateFormatter n'a pas pu reconnaître le format de date ISO.

1

La raison pour laquelle votre code ne fonctionne pas parce que

[sectionInfo name] 

retourne un objet NSString, pas un objet NSDate, qui est requis par

[dateFormatter stringFromDate:]; 

Vous ne pouvez pas simplement cast un NSString à un NSDate.

Au lieu de cela,

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

Aussi, n'AutoRelease pas un objet à moins qu'il y ait une raison particulière de le faire.

+0

Cela signifie que 'dateFromString' ne renvoie pas de date ou' stringFromDate' ne renvoie pas de chaîne. Vous pouvez suivre ce qui se passe et suivre la source de l'erreur. Je suppose que le problème est la valeur renvoyée par [nomInfo section]. –

+0

J'ai réalisé que c'est parce que le style de date est faux. Vous devez définir le style de date sur long et appeler dateFromString, puis définir le style de date sur medium et appeler stringFromDate. –

+0

OK Oliver, ive fait ceci: .. [dateFormatter setDateStyle: NSDateFormatterLongStyle]; ... NSDate * convStringDate = [dateFormatter dateFromString: [nomInfo section]]; \t [dateFormatter setDateStyle: NSDateFormatterMediumStyle]; ... NSString * convDateString = [dateFormatter stringFromDate: convStringDate]; -im toujours ne rien récupérer. Je sais que certain [nom de sectioninfo] renvoie du texte. J'ai également NSLogged convStringDate pour une date longue et toujours il retourne null – Doz

Questions connexes