0

你好,我对iOS开发相对较新(如果这个问题已经解决了,提前很抱歉),我一直在这个应用程序中的子模块用户必须输入每日数字数据,然后将列表显示在tableview中。事情是我想要以MMMM yyyy格式的NSdate变量“inputDate”进行排序(例如:名为2013年2月的部分)。但是,即使这个值是在同一个月中相同的部分进入了它不组他们(见链接在年底的插图)如何通过NSDate输入排序tableview(格式化为MMM yyyy)

这里有段代码,这似乎是相关的问题:

//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

预先感谢您的帮助。

+0

你在'dailyvalue'排序FRC,但你不显示它是什么,或者出现其他任何地方使用它... – Wain

+0

啊对不起,我正在测试通过输入“dailyvalue”进行排序,当通过“inputData”没有工作,问题仍然存在(它应该通过managedObjectContext:self.managedObjectContext sectionNameKeyPath:@“inputData”cacheName:@“Root” ];)我已经在那里了。 –

回答

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

希望这将是有用的人在相同的情况下

0

sectionNameKeyPath应该是一个字符串,而不是日期。一般情况下,您需要为您的实体添加一个瞬态属性,并将其设置为字段版本的部分标识符(在这种情况下为inputDate)。瞬态值将是您当前使用的字符串headerTitle,并且可以以相同方式生成。您可以使用KVO或保存管理对象时触发它。

+0

所以你的条目都显示在不同的部分的原因是因为它比较NSDate对象,而不是字符串。因此,即使所有日期的字符串值相同,日期值也不是这样,它将它们放在不同的部分。正如@wain所说,你将不得不按字符串版本进行排序,而不是日期版本。 – mrosales

+0

所以你的意思是将日期存储为NString属性并将该属性作为sectionNameKeyPath来调用?但按月还是按字母排序呢?对不起,如果这听起来微不足道,我不完全掌握问题的解决方案 –

+0

不,不要将字符串版本的日期存储为'sectionName'。将您计算的字符串存储为“headerTitle”。 – Wain

相关问题