我有一个UITableView,开头是空白,但由用户输入一些信息填充。用户单击UINavigationBar中的按钮,转到另一个View Controller,然后将文本填写到UITextField中,然后从UIDatePicker中选择一个日期。当用户按下Save时,将使用UITableViewNSFetchedResultsController更新Core Data

UITableView中,日期由section标头标题表示,而UITextField文本在实际cells中表示。

NSFetchRequest按日期排序,然后按字母顺序排序。

问题

这是不常见的情况,但是如果我在纽约时区中添加一个具有人员名称A的条目,然后添加另一个具有相同日期的人员名称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],我会得到相同的行为。

本质上,我想按日期排序,然后按名称排序,但是在每个日期之内,我只想按名称排序。它都是相同的日期(但只是使用不同的时区创建的),因此它将其视为同一时间的较晚时间。我没有利用任何时间。

最佳答案

将您的日期另存为同一时区中的日期,例如如有必要,可以将日期转换为格林尼治标准时间。您可以将时区信息添加到数据模型中,也可以根据运行时设置即时更改日期显示。

关于ios - 使用NSFetchRequest按日期和单元格按时区字母顺序对部分进行排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25667752/

10-14 16:59
查看更多