0

我有一个UITableView,它是开始的空白,但用户输入一些信息填充。用户点击UINavigationBar中的按钮,转到另一个View Controller并将文本填入UITextField,并从UIDatePicker中选择一个日期。当用户按Save时,使用NSFetchedResultsControllerCore 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]; 
} 

我没有做任何幻想与时区,但如果我设置NSDateComponentNSCalendar和/或UIDatePicker[NSTimeZone localTimeZone],我得到了相同的行为。本质上,我想继续按日期排序,然后按名称排序,但在每个日期内,我想按名称排序。这是完全相同的日期(但只是用不同的时区创建的),所以它将它视为同一时间的较晚时间。我没有使用任何时间。

回答

1

在同一时区将日期保存为日期,例如:如有必要,将日期转换为GMT。您可以将时区信息添加到数据模型,或根据运行时设置即时更改日期显示。

+0

感谢蒙迪 - 我明白你的意思,这是有道理的。感谢这里的答案。我以为我错过了一些操作NSSortDescriptor以预期方式工作的明显方式。 – amitsbajaj 2014-09-05 13:29:50