如何通过NSDate输入对tableview进行排序(格式化为MMM yyyy)

时间:2013-06-28 13:44:44

标签: ios uitableview nsdate nsdateformatter nsfetchedresultscontroller

您好我对iOS开发相对较新(如果此问题已经解决,请提前抱歉)我已经在此应用程序中使用此子模块,用户必须输入每日数值数据,然后列表显示在一个tableview。问题是我试图以MMMM yyyy格式的NSdate变量“inputDate”进行排序(例如:名为:2013年2月的部分)。但是,即使在同一个月输入了一个值,它也不会在同一部分中对它们进行分组(参见最后的链接以供说明)

以下是与问题相关的代码部分:

  //The Fetch result controller

  - (NSFetchedResultsController *)fetchedResultsController
{
    if (_fetchedResultsController != nil) {
        return _fetchedResultsController;
    }

    // Create and configure a fetch request with the PVMessWert entity.


NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"PVMessWert" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

    // Create the sort descriptors array.

    NSSortDescriptor *datumsort = [[NSSortDescriptor alloc] initWithKey:@"inputDate" ascending:NO];


    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:datumsort, nil];
    [fetchRequest setSortDescriptors:sortDescriptors];

    // Create and initialize the fetch results controller.


    _fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"inputDate" cacheName:@"Root"];
    _fetchedResultsController.delegate = self;



    return _fetchedResultsController;
}    

然后:titleForHeaderInSection:

    - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections]         objectAtIndex:section];

 NSArray *objects = [sectionInfo objects];
 NSManagedObject *managedObject = [objects objectAtIndex:0];
 NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterMediumStyle];
[formatter setDateFormat:@"MMMM yyyy"];
NSDate *headerDate = (NSDate *)[managedObject valueForKey:@"inputDate"];
NSString *headerTitle = [formatter stringFromDate:headerDate];

 return headerTitle;

}

然后,Dateformatter函数:

 - (NSDateFormatter *)dateFormatter
{
    static NSDateFormatter *dateFormatter = nil;
    if (dateFormatter == nil) {
        dateFormatter = [[NSDateFormatter alloc] init];

        [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
       [dateFormatter setTimeStyle:NSDateFormatterNoStyle];

    }
    return dateFormatter;
}

为了解决问题,详细介绍了detailledListView

的截图

网址:http://i.stack.imgur.com/j8Kvz.png

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

sectionNameKeyPath应该是字符串,而不是日期。通常,您可以向实体添加transient属性,并将其设置为节标识符的字符串版本(在本例中为inputDate)。瞬态值将是您当前使用的字符串headerTitle,并且可以以相同的方式生成。您可以使用KVO或保存托管对象来触发它。

答案 1 :(得分:0)

您好(很抱歉写了太多关于此事的信息)。

我能够通过添加一个字符串属性(核心数据)来将转换的NSDates存储到NSString来解决这个问题:

- (NSString *)dateToString {

   NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateStyle:NSDateFormatterMediumStyle];
    [formatter setDateFormat:@"MMMM yyyy"];
    NSDate *headerDate = (NSDate *)[self valueForKey:@"inputDate"];
    NSString *headerTitle = [formatter stringFromDate:headerDate];
    return headerTitle;
}

并获取请求,其中dateToString是关键路径。

_fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"dateToString" cacheName:@"Root"];

希望这对同样情况下的其他人有用