我有一个UITableView
,它是开始的空白,但用户输入一些信息填充。用户点击UINavigationBar
中的按钮,转到另一个View Controller
并将文本填入UITextField
,并从UIDatePicker
中选择一个日期。当用户按Save
时,使用NSFetchedResultsController
和Core Data
更新UITableView
。使用NSFetchRequest按日期和单元格按字母顺序对时区进行排序
在UITableView
内,日期由section
标题标题表示,而UITextField
文本在实际的cells
中表示。
NSFetchRequest按日期排序,然后按字母顺序排列。
问题
这不是一个常见的场景,但如果我在纽约时区与个人名称的添加一个条目,然后在另一个项目与人名B带同日增加,其将按顺序显示A然后显示B.
如果我更改为伦敦时区,并添加与人名A和同日的另一个条目,该新条目现在低于B.
我明白这是为什么发生的事情,但我不知道是什么要解决它。
代码
这是我NSFetchReqest
:
- (NSFetchedResultsController *)fetchedResultsController
{
NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
if (_fetchedResultsController != nil)
{
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Transaction" inManagedObjectContext:managedObjectContext];
fetchRequest.entity = entity;
if ([self.timelineSearchBar.text length] > 0) {
NSPredicate *predName = [NSPredicate predicateWithFormat:@"whoBy.name CONTAINS[c] %@", self.timelineSearchBar.text];
NSPredicate *predOccasion = [NSPredicate predicateWithFormat:@"occasion.title CONTAINS[c] %@", self.timelineSearchBar.text];
NSPredicate *predSubOccasion = [NSPredicate predicateWithFormat:@"subevent.title CONTAINS[c] %@", self.timelineSearchBar.text];
NSPredicate *compPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:@[predName, predOccasion, predSubOccasion]];
[fetchRequest setPredicate:compPredicate];
}
// Sorting by date and by name.
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"dates.dateOfEvent" ascending:NO];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"whoBy.name" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)];
fetchRequest.sortDescriptors = @[sort, sortDescriptor];
fetchRequest.fetchBatchSize = 20;
NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"sectionDateFormatter" cacheName:nil];
self.fetchedResultsController = theFetchedResultsController;
_fetchedResultsController.delegate = self;
return _fetchedResultsController;
}
排序描述符按日期排序,然后命名,所以它是有道理的,这种情况正在发生。
这里是我的节能方法:
- (IBAction)save:(id)sender
{
// Start by obtaining the managedObjectContext.
NSManagedObjectContext *context = [self managedObjectContext];
// Insert a new transaction
Transaction *transaction = [NSEntityDescription insertNewObjectForEntityForName:@"Transaction" inManagedObjectContext:context];
Person *enteredPerson = (Person *)[Person personWithName:self.nameTextField.text inManagedObjectContext:context];
transaction.whoBy = enteredPerson;
NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [cal components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:self.datePicker.date];
NSDate *selectedDate = [cal dateFromComponents:components]; */
NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [cal components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit
fromDate:self.datePicker.date];
NSDate *selectedDate = [cal dateFromComponents:components];
Date *date = (Date *)[Date occasionWithDate:selectedDate inManagedObjectContext:context];
transaction.dates = date;
// Save the ManagedObjectContext
NSError *error = nil;
if (![context save:&error])
{
// Error
}
[self dismissViewControllerAnimated:YES completion:nil];
}
我没有做任何幻想与时区,但如果我设置NSDateComponent
,NSCalendar
和/或UIDatePicker
到[NSTimeZone localTimeZone]
,我得到了相同的行为。本质上,我想继续按日期排序,然后按名称排序,但在每个日期内,我想按名称排序。这是完全相同的日期(但只是用不同的时区创建的),所以它将它视为同一时间的较晚时间。我没有使用任何时间。
感谢蒙迪 - 我明白你的意思,这是有道理的。感谢这里的答案。我以为我错过了一些操作NSSortDescriptor以预期方式工作的明显方式。 – amitsbajaj 2014-09-05 13:29:50