2012-10-09 125 views
0

所以我想要得到一個UITableView按部分(thing.title)顯示對象的列表,但按日期降序列出它們。UITableView切片排序順序不正確切片

該表被分成多個部分,正確標記爲(部分標題是不同的標題)。

但是每個部分中的對象只有一半是正確的。每個部分中的對象按降序列出,但某些部分包含應該在其他部分中的數據。

正在發生的事情的一個例子:

<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; 
} 
+0

之前重裝的UITableView,一定要排序的陣列和按在它的對象您的需求。您不需要使用cellforRowAtIndexpath中的代碼進行任何更改。 –

回答

1

用作獲取結果控制器sectionNameKeyPath並在第一個排序所使用的密鑰的密鑰描述符必須是相同的鍵或生成相同的相對順序。因此,您不能使用會話標題作爲sectionNameKeyPath和完全不同的密鑰時間戳作爲部分的排序描述符。

在你的情況,它可能是最好的使用時間戳作爲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]; 
} 
+0

增加了另一個sortDescriptor,並使它成爲描述符數組中的第一個描述符,並且它可以工作。 [[NSSortDescriptor alloc] initWithKey:@「sessionTitle」升序:YES] – jdog

+0

@jgervin:好的,然後我誤解了你的問題。我以爲你想按日期排列會議標題。如果我的答案有助於找到正確的解決方案,我很高興。 –

+0

我做過/做過。我的數據需要按會話標題進行分段,然後在每個分段內對象需要按時間戳排序。 – jdog