0

私は次のコードを持っています:

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

基本的に、「2009-12-04 00:00:00 +1100」のような文字列の日付であるtitleforheaderinsectionを、見栄えの良い短い文字列に変換する必要があります。そこで、dateFormatter setDateStyleのようなものを使用して変換しようとしましたが、NSLogをコンソールに出力すると、次のようになります。

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

明らかに、convDateは何も取得していませんが、[sectionInfoname]は文字列である必要があります。それを独自のNSString変数に解析したのに、なぜdateFormatterを実装できないのですか?


もう少し情報:私は以前に日付を解析しました。コードスニペットは次のとおりです。

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

さて、これをデバッグすると、基本的に生の文字列は「Sat、27 Nov 2009 17:16:00 -800」ですが、convDateを見ると、「2009-11-2700:00:00+」になります。 1100」。理由はわかりませんが、いずれにせよ、それが保存されます。私が言及したスタイルと一致すると思っていたので、dateFormatter形式を他のタイプに変更すると、詰め込まれ、convDateがnilになります。

postControllerを振り返って:興味のあるスニペットがいくつかあります:

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

}

日付で並べ替え、コードのtitleForHeaderInSectionで、文字列の日付をより見やすくなるようにフォーマットしたいと考えています。

みんなありがとう

4

3 に答える 3

1

コードが機能しない理由は

[sectionInfo name]

NSDateオブジェクトではなく、NSStringオブジェクトを返します。

[dateFormatter stringFromDate:];

NSStringをNSDateに単純にキャストすることはできません。

その代わり、

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

また、特別な理由がない限り、オブジェクトを自動解放しないでください。

于 2009-12-21T23:17:32.510 に答える
1

予期しない動作が発生した理由は、解析中に日付形式を次のように設定していたためです。

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

時間情報がないため、日付に時差がありました。

また、解析中に設定convDateしていた

NSDate *convDate = [dateFormatter dateFromString:string];

これはNSDateを格納しており、NSStringではないため、 NSFetchResultsControllerdescriptionがセレクターを呼び出しています。convDate

NSDateFormatterがISO日付形式を認識できなかった理由が完全にはわかりません。

于 2009-12-22T14:47:15.073 に答える
0

http://iosdevelopertips.com/cocoa/date-formatters-examples-take-2.htmlにアクセスし、http: //unicode.org/reports/tr35/#Date_Format_Patternsをガイドとして使用して、解決策を見つけました。デバッグしました。変数が着信文字列と一致することを確認するまでのコード

于 2009-12-22T04:21:25.767 に答える