سؤال

لدي الرمز التالي:

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

أنا بحاجة أساسًا إلى تحويل titleforheaderinsection وهو تاريخ سلسلة مثل "2009-12-04 00:00:00 +1100" إلى سلسلة أجمل تبدو أقصر. لذلك حاولت تحويله باستخدام شيء مثل 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

من الواضح أن القناصة لا تحصل على أي شيء ، ولكن [اسم القسم] يجب أن يكون سلسلة. لقد قمت بتحليله في متغير 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];

الآن ، عندما أقوم بتصحيح هذا ، فإن السلسلة الأولية هي "السبت ، 27 نوفمبر 2009 17:16:00 إلى 800" ولكن عندما أنظر إلى القناصة ، فإنها تأتي "2009-11-27 00:00:00 + 1100 ". لست متأكدًا من السبب ، ولكن على أي حال ، هذا ما يتم تخزينه. كنت أعتقد أنه سيتطابق مع النمط الذي ذكرته ، لذلك إذا قمت بتغيير التنسيق DateFormatter إلى أي نوع آخر ، فإنه سيؤدي إلى أن يصبح الأمر لا شيء.

إذا نظرنا إلى الوراء في مرحلة ما بعد العلم: لدي بعض القصاصات ذات الاهتمام:

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

}

آمل أن أحدد حسب التاريخ ، وأعلى في الكود الخاص بي ، في titleforhederinsection ، قم بتنسيق تاريخ سلسلةي لتبدو أكثر قابلية للتقدم.

شكرا يا رفاق

هل كانت مفيدة؟

المحلول

السبب في حصولك على سلوك غير متوقع هو أنه أثناء التحليل ، كنت تحدد تنسيق التاريخ إليه

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

التي لا تحتوي على معلومات زمنية ، وهذا هو السبب في وجود فرق زمني في التواريخ.

أيضا ، أثناء التحليل كنت تحدد convDate مع

NSDate *convDate = [dateFormatter dateFromString:string];

الذي يقوم بتخزين nsdate و حاسمة NSFetchResultsController يتصل description محدد على convDate لأنه ليس NSString.

لست متأكدًا تمامًا من سبب عدم قدرة NSDateFormatter على التعرف على تنسيق تاريخ ISO.

نصائح أخرى

السبب في أن الكود الخاص بك لا يعمل هو بسبب

[sectionInfo name]

إرجاع كائن NSString ، وليس كائن NSDate ، وهو مطلوب بواسطة

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

أيضًا ، لا تقم بإعداد كائن ما لم يكن هناك سبب محدد للقيام بذلك.

لقد وجدت الحل بالذهاب إلى http://iosdevelopertips.com/cocoa/date-formatters-examples-take-2.html واستخدام http://unicode.org/reports/tr35/#date_format_patterns كدليل ، قمت بتصحيح رمزتي حتى تأكد من مطابقة المتغير مع السلسلة الواردة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top