Objective-C: [sectionInfo name] von NSFetchedResultsSectionInfo muss dateFormatted sein
-
20-09-2019 - |
Frage
Ich habe den folgenden Code:
-(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]];
}
Ich brauche den im Grunde die titleforheaderinsection zu konvertieren, die ein String Datum ist wie „2009.12.04 00.00.00 +1100“ ein schöneres kürzere Zeichenfolge suchen. Also habe ich versucht, es so etwas wie dateFormatter setDateStyle Converting, aber wenn ich Ausgang der NSLog zu trösten ich die folgende bekommen:
2009-12-22 09: 42: 10.156 app [94.614: 207] section 2009-12-04 00.00.00 +1100 2009-12-22 09: 42: 10,157 app [94.614: 207] convDate (null
Offensichtlich ist die convDate ist nicht immer alles, aber [sectionInfo name] sollte ein String sein. Ich habe es in seinen eigenen NSString Variable analysiert, so warum kann ich die dateFormatter auf sich umzusetzen?
Weitere Informationen Bit: Ich habe das Datum unter anderem analysieren früher auf, mit dem Code-Snippet zu sein:
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];
Nun, wenn ich diese debuggen, im Wesentlichen die rohe Zeichenfolge „Sa 27. November 2009 17.16.00 -800“, aber wenn ich an der convDate aussehen kommt es heraus zu sein „2009-11-27 00.00 : 00 +1100" . Nicht sicher, warum, aber in jedem Fall, das ist, was wird gespeichert. Ich hätte es gedacht hätte die mit dem Stil i erwähnt, so dass, wenn ich das dateFormatter Format auf jede andere Art ändern, wäre es zu stopfen und convDate werden gleich Null.
an meinem Postcontroller Blick zurück: Ich habe ein paar Schnipsel von 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;
}
Ich hoffe, nach Datum zu sortieren, und in meinem Code, in titleForHeaderInSection, formatieren Sie mein String Datum mehr vorzeigbar aussehen.
Danke Jungs
Lösung
Der Grund, warum Sie wurden unerwartetes Verhalten bekommen, weil bei der Analyse der Sie das Datumsformat wurden Einstellung
[dateFormatter setDateFormat:@"eee, dd MMM yyyy"];
, die keine Zeitinformationen haben, weshalb es eine Zeitdifferenz in den Daten war.
Auch bei der Analyse des von Ihnen Einstellung convDate
mit
NSDate *convDate = [dateFormatter dateFromString:string];
, die eine NSDate speichert und entscheidend NSFetchResultsController ist die description
Wähler auf convDate
aufrufen, weil es nicht ein NSString ist.
Ich bin nicht ganz sicher, warum NSDateFormatter konnte das ISO-Datumsformat nicht erkennen.
Andere Tipps
Der Grund, Ihr Code nicht funktioniert, weil
[sectionInfo name]
gibt ein NSString Objekt, keine NSDate Objekt, das durch
erforderlich ist[dateFormatter stringFromDate:];
Sie können nicht einfach ein NSString zu einem NSDate gegossen.
Stattdessen
- (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;
}
Auch, Autorelease ein Objekt nicht, es sei denn es einen bestimmten Grund, dies zu tun.
Ich fand die Lösung, indem Sie auf http: // iosdevelopertips. com / Kakao / Datum-Formatierer-Beispiele-take-2.html und mit http: //unicode.org/reports/tr35/#Date_Format_Patterns als Führer, gedebuggt ich meinen Code, bis ich, dass der Variable mit dem eingehenden Zeichenfolge
abgestimmt ist sichergestellt