如何通过 NSDate 输入对表格视图进行排序(格式化为 MMM yyyy)
Posted
技术标签:
【中文标题】如何通过 NSDate 输入对表格视图进行排序(格式化为 MMM yyyy)【英文标题】:how to sort tableview by an NSDate input (Formatted to MMM yyyy) 【发布时间】:2013-06-28 13:44:43 【问题描述】:您好,我对 ios 开发比较陌生(抱歉,如果这个问题已经解决了),我一直是这个应用程序中的这个子模块,用户必须输入每日数值数据,然后列表显示在一个表视图。问题是我正在尝试按 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
提前感谢您的帮助。
【问题讨论】:
您正在对dailyvalue
上的 FRC 进行排序,但您没有显示它是什么或似乎在其他任何地方使用它...
对不起,我正在测试按输入的“每日值”排序,当“inputData”不起作用时,问题仍然存在(应该是 managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"inputData " cacheName:@"Root"];) 我已经在那里了。
【参考方案1】:
sectionNameKeyPath
应该是字符串,而不是日期。通常,您会为您的实体添加一个临时属性并将其设置为您的部分标识符的字符串版本(在这种情况下为inputDate
)。瞬态值将是您当前用作headerTitle
的字符串,并且可以以相同的方式生成。您可以使用 KVO 或在保存托管对象时触发它。
【讨论】:
所以您的条目都显示在不同部分的原因是因为它比较的是 NSDate 对象,而不是字符串。因此,即使所有日期的字符串值都相同,但日期值却不同,因此会将它们放在不同的部分中。正如@wain 所说,您必须按字符串版本而不是日期版本进行排序。 所以你的意思是将日期存储为 NString 属性并将该属性称为 sectionNameKeyPath?但这会按月还是按字母排序?对不起,如果这听起来微不足道,我没有完全掌握问题的解决方案 不,不要将日期的字符串版本存储为sectionName
。将您计算的字符串存储为headerTitle
。
是的,这就是 FRC 将用来进行部分分组的方法。您可以从 FRC 取回它以用作委托方法中的部分标题。
好吧,现在我明白了,但是如何以编程方式调用或使用它?【参考方案2】:
您好(抱歉,关于此事写了太多)。
我能够通过添加一个字符串属性(核心数据)来将转换后的 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"];
希望这对处于相同情况的其他人有用
【讨论】:
以上是关于如何通过 NSDate 输入对表格视图进行排序(格式化为 MMM yyyy)的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 NSDate 属性对 NSMangedObjects 进行排序