在表格视图部分中对核心数据对象进行排序

     2023-02-27     216

关键词:

【中文标题】在表格视图部分中对核心数据对象进行排序【英文标题】:Ordering core data objects inside a table view section 【发布时间】:2014-01-28 18:57:01 【问题描述】:

我正在使用 NSSortDescriptors 对核心数据对象进行排序并根据日期属性创建表格视图部分。使用这种 SortDescriptor,表格视图部分按预期排序,但部分内的行也按相同的日期属性排序。有没有办法在每个部分内有另一个订购系统?我猜主要问题是核心数据存储日期对象的日期+时间值,这样就没有对象具有完全相同的日期值。但我需要根据另一个属性对同一部分内的对象进行排序。 谢谢。

这是我的 NSFetchedResultsController 代码:

-(NSFetchedResultsController*)fetchedResultsController

    if (_fetchedResultsController != nil)
        return _fetchedResultsController;
    
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init];
    NSManagedObjectContext *context = self.managedObjectContext;
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:context];
    [fetchRequest setEntity:entity];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]initWithKey:@"itemDate" ascending:YES];
    NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc]initWithKey:@"itemName" ascending:NO];

    NSArray *sortDescriptors = [[NSArray alloc]initWithObjects:sortDescriptor,sortDescriptor1, nil];
    fetchRequest.sortDescriptors = sortDescriptors;
    _fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:@"sectionIdentifier" cacheName:nil];
    _fetchedResultsController.delegate = self;
    return _fetchedResultsController;

编辑问题

这是添加到 cellForRowAtIndexPath 方法中的一段代码:

int indexpathsection = indexPath.section;
    [self sortedSectionForIndex:indexpathsection];
    NSLog(@"INDEXPATH= %ld", (long)indexPath.section);

这是马库斯提出的方法:

- (NSArray*)sortedSectionForIndex:(NSInteger)index

    NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"priority" ascending:YES];
    id section = [[self fetchedResultsController] sections][index];
    NSLog(@"INDEX********* = %ld", (long)index);
    NSArray *objects = [section objects];
    NSArray *sorted = [objects sortedArrayUsingDescriptors:@[sort]];
    return sorted;

【问题讨论】:

欢迎来到***!如果你展示你的数据结构/代码,你会得到更好的答案。 谢谢,我会将我的 NSFetchedResultsController 代码添加到我的问题中。 @CorleyBrigman,我已将代码添加到问题中。 【参考方案1】:

NSFetchedResultsController 用于通过单个排序或一组排序来控制排序顺序。它不是为了做你想做的事。

但你可以做到,只是不够干净。

首先,讨论对一个部分进行排序。这不需要您编写自己的排序算法:

- (NSArray*)sortedSectionForIndex:(NSInteger)index

    NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"MyKey" ascending:YES];
    id section = [[self fetchedResultsController] sections][index];
    NSArray *objects = [section objects];
    NSArray *sorted = [objects sortedArrayUsingDescriptors:@[sort]];
    return sorted

使用该方法,您可以在想要检索对象时要求对部分进行排序。但是,这是低效的,因为每次您想要触摸 UITableViewController 中的 LOT 的对象时都会进行排序。

取而代之的是,将这个示例与您的 NSFetchedResultsController 及其委托方法集成,以便您存储排序后的数组并保持它们同步。这样,您只需在数据更改时进行排序,而不是在每次方法调用时进行排序。

更新

我提供给您的排序代码不会对NSFetchedResultsController 内部 的内容进行排序。它获取该部分中的内容,对其进行排序并返回排序后的数组。所以你需要使用它返回的内容:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    NSArray *sorted = [self sortedSectionForIndex:[indexPath section]];
    id object = [sorted objectAtIndex:[indexPath row]];

    id cell = ...; //Now get your cell reference

    //Now update your cell with the data from object

    return cell;

【讨论】:

我认为您的回答应该对我有所帮助,但在哪里整合它将是我的下一个问题。你说要将它与我的 NSFetchedResultsController 及其委托方法集成,但是如何,我知道这是一个返回数组的完整方法,但我不知道我应该从哪里调用它......谢谢你的帮助 从任何需要访问数据的地方。 -cellForRowAtIndexPath... 可能是一个不错的起点。 Marcus,当从 cellForRowAtIndexPath 方法调用你的方法时,我想我应该这样做:[self sortedSectionForIndex:sectionIndex]; sectionIndex 应该是要排序的部分。 马库斯,我做了如下: int indexPathSection = indexPath.section; [self sortedSectionForIndex:indexPathSection];在 cellForRowAtIndexPath 方法内部。它不会对放在 sortDescriptorWithkey 中的属性进行排序。 马库斯,你能帮我解决我之前的评论吗?我真的很感激。谢谢。【参考方案2】:

您可以在NSManagedObjectawakeFromFetch 方法中规范化属性的时间组件。

- (void) awakeFromFetch 
    [super awakeFromFetch];
    NSDateComponents* comps = [[NSCalendar currentCalendar] components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit  fromDate:self.itemDate];
    self.itemDate = [[NSCalendar currentCalendar] dateFromComponents:comps];     

此外,查看您的代码,您必须告诉NSFetchedResultsController 它应该基于什么分节符。为此,您可以在初始化时为分节符提供一个 keyPath。对于您的情况,不要使用sectionNameKeyPath:@"sectionIdentifier",而是使用第一个排序键:

    _fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:@"itemDate" cacheName:nil];

【讨论】:

谢谢,但是按照您的建议更改 sectionNameKeyPath 不起作用,这些部分未显示... 我添加了有关如何在托管对象中标准化 itemDate 的时间分量的信息。

核心数据按格式化日期排序表格视图

】核心数据按格式化日期排序表格视图【英文标题】:CoreDatasorttableviewbyformatteddate【发布时间】:2012-06-1913:38:35【问题描述】:我知道如何通过NsDate对tableview中的CoreData对象进行排序,但默认情况下这似乎为每个对象创建了一个... 查看详情

如何对两个不同的核心数据对象进行排序?

...-姓名、年龄、出生日期周年纪念日-姓名、周年纪念日在表格视图中分别显示每个实体可以使用获取的结果控制器来完成。没关系!!但是,我想展示一个结合了生日和周年纪念日的表格视图。排序应该通过从 查看详情

是否可以在文本视图中对数据进行排序?

...替换了它。它运作良好,但...我需要排序,显示的是带有表格的文本视图。我应该使用listviews而不是textviews/table 查看详情

在 UITableView 中对核心数据多对关系进行排序

】在UITableView中对核心数据多对关系进行排序【英文标题】:Sortingcoredatato-manyrelationshipinUITableView【发布时间】:2013-04-0419:25:35【问题描述】:我在这里看到了很多关于这个问题的帖子,但似乎没有一个可以解决我遇到的问题。... 查看详情

在手动创建的部分中对核心数据 tableView 行进行分组

】在手动创建的部分中对核心数据tableView行进行分组【英文标题】:GroupingcoredatatableViewrowsinmanuallycreatedsections【发布时间】:2011-01-2317:07:00【问题描述】:我有一个Company实体,其中包含大约20个字段,我想使用带有手动创建的部... 查看详情

按两个依赖属性对核心数据实体进行排序

...lue2。我想构造一个NSFetchedResultsController,这样我就可以在表格视图中显示我的属性。表格视图应按totalValue排序,女巫 查看详情

我的 Fetched Results Controller 没有在旧条目中对新条目进行排序

...tries【发布时间】:2019-11-2121:14:49【问题描述】:我有7个表格视图,每天一个。我将带有名称、starTime、endtime等的课程模型添加到日表中,并保存到核心数据中。我的NSFetched 查看详情

使用 NSPredicate 对表视图中的核心数据进行排序 (Swift)

...用NSPredicate时需要帮助。我目前在我的应用程序中有一个表格视图和一个搜索栏。我还有一个名为Item的实体,其属性为allergen(字符串) 查看详情

在 tableview 中对动态部分进行排序 |迅速

】在tableview中对动态部分进行排序|迅速【英文标题】:Issuesortingdynamicsectionsintableview|Swift【发布时间】:2021-11-0318:32:18【问题描述】:如何对从datestamp字段动态生成的以下部分进行排序?例如2021-11-3的部分需要显示在2021-11-2上方... 查看详情

在 Redux reducer 中对对象数组进行排序

...ellusviverramattisdolor"]我向reducer发送一个动作:(reducer的一部分)case\'SORT 查看详情

Swift UITableView(无部分)过滤到带有部分的表格视图

】SwiftUITableView(无部分)过滤到带有部分的表格视图【英文标题】:SwiftUITableView(nosections)filtertotableviewwithsections【发布时间】:2018-09-3019:16:22【问题描述】:我在表格视图中显示了一个自定义对象[物种]的列表,该列表按字母顺... 查看详情

从 JSON 数据中对 UItableview 中的排序和部分进行排序

】从JSON数据中对UItableview中的排序和部分进行排序【英文标题】:Sorting&sectioninUItableviewfromJSONdata【发布时间】:2019-05-0111:15:26【问题描述】:我已经定义了包数据的数据模型,但是需要在此基础上定义UITableviewsectionssubscription... 查看详情

如何在 UITableview 的部分中对 NSarray 进行排序

】如何在UITableview的部分中对NSarray进行排序【英文标题】:HowtosortNSarrayinSectionsforUITableview【发布时间】:2012-05-0311:21:05【问题描述】:您好,我如何按Day对我的Array进行排序,我从我的网络服务器(Json)获取数据并解析到NSDictionary... 查看详情

如何使用核心数据实现表格部分

】如何使用核心数据实现表格部分【英文标题】:Howtoimplementtablesectionswithcoredata【发布时间】:2013-11-2717:25:32【问题描述】:我在我的iOS应用程序中使用核心数据。我有一个表格视图来显示来自名为人员的实体的数据。实体person... 查看详情

在 Visio 中对数据库进行逆向工程时无法添加视图

】在Visio中对数据库进行逆向工程时无法添加视图【英文标题】:IcannotaddviewswhenreverseengineeringmydatabaseinVisio【发布时间】:2014-12-1921:10:39【问题描述】:我正在尝试将2012SQLServer的部分逆向工程到MicrosoftVisio2010。视图选项显示为灰... 查看详情

将核心数据加载到数组中,然后填充表视图,重新排序数组对象不会持久

...做什么。将数据加载到数组中(从核心数据实体),填充表格视图,如果用户想要,重新排序单元格并更新数组。就是 查看详情

如何在 Python 中对表格进行排序

】如何在Python中对表格进行排序【英文标题】:HowtosortTableinPython【发布时间】:2019-03-0410:40:55【问题描述】:您好,我想根据每支球队的积分而不是球队名称来对德甲联赛表进行排序。有人能帮我吗?目前我只能按团队名称对... 查看详情

将表格视图单元格中的数据保存在核心数据中

】将表格视图单元格中的数据保存在核心数据中【英文标题】:Savingdatafromtableviewcellsincoredata【发布时间】:2012-07-1423:05:38【问题描述】:您好,我正在尝试将数据保存到核心数据中,但遇到了一些麻烦...我有一个团队实体和一... 查看详情