質問

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

   -(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アプリ[94614:207] 2009-12-04午後12時00分00秒1100をセクション名 2009-12-22 09:42:10.157アプリ[94614:207] convDate(NULL

もちろんconvDateは何も得ていないが、[sectionInfo名]は文字列でなければなりません。私は、独自の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];

さて、私はこれをデバッグするとき、基本的に生の文字列は「土、2009年11月27日午前17時16分00秒-800」ですが、私はconvDateを見たときには、「2009年11月27日午後12時であることを出てきます: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でいます、より多くの体裁見て、私の文字列の日付をフォーマットします。

みんなありがとう。

役に立ちましたか?

解決

解析中にあなたが日付の書式を設定しているので、あなたが予期しない動作を取得した理由がある。

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

日付の時間差があった理由は何時間情報を、持っていないこれます。

また、あなたがconvDateを設定し、解析中に

NSDate *convDate = [dateFormatter dateFromString:string];

NSDateを記憶していると、それはNSStringのではないので、の決定的のNSFetchResultsControllerはdescriptionconvDateセレクタを呼び出している。

私はNSDateFormatterは、ISO日付形式を認識できなかった理由を全くわからない。

他のヒント

あなたのコードが動作しない理由は、

であります
[sectionInfo name]

によって要求されるNSStringのオブジェクトではなく、NSDateオブジェクトを返します
[dateFormatter stringFromDate:];

あなたは、単にNSDateにNSStringのをキャストすることはできません。

その代わり、

- (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;
}
そうする特別な理由がない限り、

また、オブジェクトを自動解放しません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top