Question

Je le code suivant:

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

Je suis besoin essentiellement de convertir le titleforheaderinsection qui est une date de chaîne comme « 2009-12-04 00:00:00 +1100 » à une plus belle à la recherche chaîne plus courte. J'ai donc essayé de convertir en utilisant quelque chose comme DateFormatter setDateStyle, mais j'obtenir ce qui suit quand je sortie la NSLog à la console:

22/12/2009 09: 42: 10,156 app [94614: 207] SectionName 04.12.2009 00:00:00 +1100 22/12/2009 09: 42: 10,157 app [94614: 207] convDate (null

Il est évident que le convDate ne reçoit rien, mais [nom sectionInfo] 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: Je parse la date entre autres plus tôt, avec l'extrait de code étant:

   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 le convDate il sort d'être « 2009-11-27 00:00 : 00 +1100" . Je ne sais pas pourquoi, mais en tout cas, c'est ce qui est stockée. Je l'aurais pensé que ce serait correspondre au style je l'ai mentionné, donc si je change le format DateFormatter à tout autre type, il farcir et convDate deviennent nulles.

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 pour regarder plus présentable.

Merci les gars

Était-ce utile?

La solution

La raison pour laquelle vous obtenez un comportement inattendu est parce que vous définissez lors de l'analyse du format de la 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.

En outre, lors de votre analyse syntaxique établissiez convDate avec

NSDate *convDate = [dateFormatter dateFromString:string];

qui stocke un NSDate et cruciale NSFetchResultsController appelle le sélecteur de description sur convDate car il ne constitue pas une NSString.

Je ne suis pas tout à fait sûr pourquoi NSDateFormatter ne pouvait pas reconnaître le format de date ISO.

Autres conseils

La raison pour laquelle votre code ne fonctionne pas parce que

[sectionInfo name]

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

[dateFormatter stringFromDate:];

Vous ne pouvez pas simplement jeter un coup NSString à un NSDate.

Au lieu,

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

En outre, ne pas AutoRelease un objet moins qu'il y ait une raison particulière de le faire.

J'ai trouvé la solution en allant à http: // iosdevelopertips. com / cacao / date-formatteurs-exemples-take-2.html et en utilisant http: //unicode.org/reports/tr35/#Date_Format_Patterns comme guide, je débogués mon code jusqu'à ce que je me suis assuré que la variable est adaptée à la chaîne entrante

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top