UITableView 以排序顺序划分,未正确划分

Posted

技术标签:

【中文标题】UITableView 以排序顺序划分,未正确划分【英文标题】:UITableView sectioned with sort order not sectioning correctly 【发布时间】:2012-10-09 01:29:17 【问题描述】:

所以我试图让 UITableView 按部分(thing.title)显示对象列表,但按日期降序排列。

表格分为多个部分,标记为正确(部分标题是不同的事物标题)。

但是每个部分的对象只对了一半。每个部分中的对象按降序排列,但某些部分包含应在其他部分中的数据。

正在发生的事情的一个例子:

<Header> Big Title Name
    <data><Big Title><id=1></data>
    <data><Big Title><id=4></data>
    **<data><Small Title><id=6></data>**   <-- should not be in this section


<Header> Small Title Name
    <data><Small Title><id=11></data>
    <data><Big Title><id=23></data>  <-- should not be in this section
    **<data><Small Title><id=66></data>**

这是我的部分代码:

- (NSFetchedResultsController *)fetchedResultsController 

if (fetchedResultsController != nil) 
    return fetchedResultsController;


/*
 Set up the fetched results controller.
 */
// Create the fetch request for the entity.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"AReads" inManagedObjectContext:[NSManagedObjectContext defaultContext]];
[fetchRequest setEntity:entity];

// Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:20];

// Sort using the timeStamp property..
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timeStamp" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

[fetchRequest setSortDescriptors:sortDescriptors];

// Use the sectionIdentifier property to group into sections.
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[NSManagedObjectContext defaultContext] sectionNameKeyPath:@"sessionTitle" cacheName:@"Root"];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;

return fetchedResultsController;



- (NSString*) tableView:(UITableView *)tableView titleForHeaderInSection:  (NSInteger)section

//return [(Sessions*)[masterSessions objectAtIndex: section] title];
id <NSFetchedResultsSectionInfo> theSection = [[fetchedResultsController sections] objectAtIndex:section];



NSString *theTitle = [theSection name];


return theTitle;

【问题讨论】:

在重新加载您的 UITableView 之前,请确保根据您的要求对数组和其中的对象进行排序。您无需对 cellforRowAtIndexpath 中的代码进行任何更改。 【参考方案1】:

用作提取结果控制器的sectionNameKeyPath 的键和第一个排序描述符中使用的键必须是相同的键或生成相同的相对排序。所以你不能使用 sessionTitle 作为sectionNameKeyPath 和一个完全不同的键 timeStamp 作为部分的排序描述符。

在您的情况下,最好使用 timeStamp 作为sectionNameKeyPath 并在排序描述符中。这将确保所有条目都正确分组。

要在节标题中显示 sessionTitle 而不是 timeStamp,您可以修改 titleForHeaderInSection:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section  
    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.controller sections] objectAtIndex:section];
    return [[[sectionInfo objects] objectAtIndex:0] sessionTitle];

【讨论】:

添加了另一个 sortDescriptor 并使其成为描述符数组中的第一个描述符并且它可以工作。 [[NSSortDescriptor alloc] initWithKey:@"sessionTitle" 升序:YES] @jgervin:好的,那我稍微误解了你的问题。我以为你想要按日期排序的会话标题。如果我的回答有助于找到正确的解决方案,我很高兴。 我做过/做过。我的数据需要按会话标题划分,然后在每个部分中,对象需要按时间戳排序。

以上是关于UITableView 以排序顺序划分,未正确划分的主要内容,如果未能解决你的问题,请参考以下文章

快速排序,排序基础

将自定义对象的 NSArray 转换为按字母顺序划分的带有索引的 UITableView?

快速排序

划分算法与快速排序

划分_快速排序的前提技术

双日练 | 快速排序的递归次数问题