我正在使用NSFetchedResultsController来分组,其中的sectionNameKeyPath是根据类别。
我的分类是:成人,儿童,视觉,无。
升序排序:成人、儿童、无、视觉
降序排序:愿景、无、儿童、成人
我希望无论排序顺序如何,最终都不会出现任何类别。
升序所需排序:成人、儿童、视觉、无
所需降序排序:愿景、儿童、成人、无
使用的代码如下:
let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: managedOC, sectionNameKeyPath: "category", cacheName: nil)发布于 2017-10-27 16:45:18
我认为既然你将类别存储为字符串,而字符串值只能按字母顺序排序。是否可以在数据库中创建一个数值字段?和存储的数值,如成人= 1,儿童= 2,视觉= 3,无= 4,通过您可以轻松地排列和排序的数据,无论是升序或降序。希望这能对你有所帮助。
发布于 2017-10-28 02:27:31
如果您愿意修改CoreData模型,您可以创建一个新实体来表示类别。Category实体将有三个属性:name (字符串)、ascOrder (整数16)和descOrder (整数16)。然后(作为一次性任务)创建四个具有如下值的Category对象:
name ascOrder descOrder
==== ======== =========
Adult 1 3
Child 2 2
Vision 3 1
None 4 4使用与Category的(一对一)关系替换实体的category属性。反向关系应该是对多个。现在,您可以使用name“成人”来设置与Category对象的关系,而不是将属性值设置为“成人”。然后,您可以配置您的FRC,按关键字category.ascOrder或category.descOrder对对象进行排序,并指定相应的sectionNameKeyPath。
结果是,您的表将被分组为多个部分并正确排序。但是,由于sectionNameKeyPath为ascOrder (或descOrder),因此name属性将为1、2、3或4,而不是“成人”、“儿童”等。要解决此问题,请在tableView的titleForHeaderInSection或viewForHeaderInSection方法中,不要使用:
let sectionInfo = self.fetchedResultsController.sections![section]
let sectionName = sectionInfo.name而是通过从部分中的第一项遍历关系来获取名称:
let sectionInfo = self.fetchedResultsController.sections![section]
let firstItem = sectionInfo.objects![0] as! YourEntity
let sectionName = firstItem.name如果您正在使用索引,那么索引标题也可能存在类似的问题。
如果你的应用已经上线了,这种方法的一个缺点就是需要迁移你的数据。我不记得轻量级迁移是否能够处理替换具有与新实体的关系的属性;我把它留给您来研究。
https://stackoverflow.com/questions/46969625
复制相似问题