在uitableview部分标题内的日期格式,请帮助

时间:2009-12-01 17:42:17

标签: iphone header datepicker

首先让我开始说我对iphone开发非常新,但是我很努力学习,所以任何有帮助的人都愿意分享我们非常感谢!所以我有一个问题,如果有人可以为我回答那就太棒了。我正在研究更多的核心数据,并且一直在使用来自Apple开发者网站here的核心数据书示例。这是一个非常直接的应用程序,但我试图改变一些东西,我无法弄清楚如何做到这一点,它正在驱使我疯狂!本地,应用程序在tableview部分标题中显示作者,标题在单元格中。我想更改它并将版权日期(本书的一个属性)设置为节标题。现在,我可以让它显示,但它以这种格式显示日期:

2009-12-01 10:11:31 -0700

但那不是正确的格式,我喜欢使用这种格式:

12月1日星期二

可能使用此代码:

NSDateFormatter * outputFormatter = [[NSDateFormatter alloc] init];

[outputFormatter setDateFormat:@“EEEE MMMM d”];

NSString * date = [outputFormatter stringFromDate:[NSDate date]];

但问题是日期值是从datepicker进来的,我无法弄清楚(所有这些疯狂的'关键'业务)如何格式化来自选择器的日期值并将其放到部分标题。如果您有任何时间可以按照上面的苹果wbsite链接并四处寻找,直到您能够回答我的困境,那将非常感激!!!!谢谢。

好的,这是我在save方法中输入的代码:

 // Pass current value to the edited object, then pop.
if (editingDate) {
    NSString *rawDate = (NSString *)datePicker.date;
    NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init];
    [outputFormatter setDateFormat:@"yyyy-MM-dd"];
    NSDate *date = (NSDate *)[outputFormatter dateFromString:rawDate]; 

    [outputFormatter setDateFormat:@"EEEE MMMM d"];
    NSString *formattedDateStr = (NSString *)[outputFormatter stringFromDate:date];

    [editedObject setValue:(NSDate *)formattedDateStr forKey:editedFieldKey];
}

然后无论出于何种原因,日期都不会保存在应用程序中,并且编译器会抛出此错误:

调试器已退出,状态为0。 [会议开始于2009-12-02 09:51:26 -0700。] 2009-12-02 09:51:47.342 CoreDataBooks [17981:20b] * - [__ NSCFDate length]:无法识别的选择器发送到实例0x3e79850 2009-12-02 09:51:47.343 CoreDataBooks [17981:20b] * 由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:'*** - [__ NSCFDate length]:无法识别的选择器发送到实例0x3e79850'

可能只是一个快速修复,我希望我至少在代码的右半球,再次感谢您有时间提供任何帮助或见解。

1 个答案:

答案 0 :(得分:4)

至少在这里更改日期格式时,您不必担心关键业务。 book对象中的copyright属性将使用EditingViewController中的key-business自动更改。

因此,您只需要更改显示该属性的位置。 在DetailViewController.m中,更改此方法:

- (NSDateFormatter *)dateFormatter {    
    if (dateFormatter == nil) {
        dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateStyle:NSDateFormatterMediumStyle];  //REMOVE
        [dateFormatter setTimeStyle:NSDateFormatterNoStyle];  //REMOVE
    }
    return dateFormatter;
}

对此:

- (NSDateFormatter *)dateFormatter {    
    if (dateFormatter == nil) {
        dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"EEEE MMMM d"];  //NEW LINE
    }
    return dateFormatter;
}

编辑:忘记提及实际显示是在同一文件中的cellForRowAtIndexPath中完成的。但是该显示代码使用类级变量dateFormatter,因此我们只修改其初始化。

编辑#2:您修改了示例代码,以按照图书版权日期对行进行分组。要修改标题部分中的日期格式,可能有一种更优雅的方式,但这是一个粗略的解决方案。将RootViewController.m中的titleForHeaderInSection修改为:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    NSString *rawDateStr = [[[fetchedResultsController sections] objectAtIndex:section] name];

    //convert default date string to NSDate...
    NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss ZZ"];
    NSDate *date = [formatter dateFromString:rawDateStr];

    //convert NSDate to format we want...
    [formatter setDateFormat:@"EEEE MMMM d"];
    NSString *formattedDateStr = [formatter stringFromDate:date];

    return formattedDateStr;
}

上述更改假设您只按日期执行部分。如果没有,您将需要检查当前分组是否按日期,否则它将尝试将作者的姓名或标题转换为日期和崩溃。您可能还想添加空/无效日期检查。

编辑#3:版权字段是NSDate,其中包含日期和时间。要仅按日期分组,在编辑版权字段时,将时间部分设置为00,如下所示(在EditingViewController.m中的保存方法中):

    // Pass current value to the edited object, then pop.
if (editingDate) {
    NSDate *pickedDateTime = datePicker.date;

    NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
    [formatter setDateFormat:@"yyyy-MM-dd 00:00:00 -0000"];
    NSString *pickedDateStr = [formatter stringFromDate:pickedDateTime];
    pickedDateTime = [formatter dateFromString:pickedDateStr];

    [editedObject setValue:pickedDateTime forKey:editedFieldKey];
}

但是,由于Apple示例中提供的示例数据已经在版权字段中包含时间,因此编辑或添加一本书不会将其与具有相同日期的另一个组放在同一组中,因为另一本书仍具有时间部分。如果你编辑这两本书并保存,它将清除两者中的时间,它们将显示在同一组中。

更好的解决方案是以某种方式告诉SortDescriptor只查看版权的日期部分而不是版权原样,但我不知道该如何做到这一点。