您應該只傳遞「name」作爲sectionNameKeyPath。查看此answer的問題「帶有索引的核心數據支持的UITableView」。
UPDATE
也就是說,如果你只關心具有快速索引標題滾動解決方案僅適用。在這種情況下,你不會顯示節標題。請參閱下面的示例代碼。
否則,我同意refulgentis一個瞬態屬性是最好的解決方案。此外,在創建NSFetchedResultsController時,該sectionNameKeyPath有此限制:
如果這個關鍵路徑是不一樣的,通過在fetchRequest第一個排序 描述符中指定 ,他們必須 產生相同的相對排序。例如,fetchRequest中的第一個排序描述符 可能爲持久性屬性指定密鑰 ; sectionNameKeyPath可能會爲從 派生的瞬態屬性指定密鑰 持久性屬性。
樣板UITableViewDataSource實現使用NSFetchedResultsController:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return [[fetchedResultsController sections] count];
}
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
return [fetchedResultsController sectionIndexTitles];
}
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
return [fetchedResultsController sectionForSectionIndexTitle:title atIndex:index];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
return [sectionInfo numberOfObjects];
}
// Don't implement this since each "name" is its own section:
//- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
// id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
// return [sectionInfo name];
//}
更新2
對於新的 'uppercaseFirstLetterOfName' 瞬態特性,在模型中,並檢查一個新字符串屬性添加到相關實體「瞬態」框。
有幾種實現getter的方法。如果您正在生成/創建子類,那麼您可以將其添加到子類的實現(.m)文件中。
否則,您可以創建NSManagedObject類別(我把這個權利在我的視圖控制器的實現文件的頂部,但你可以在適當的頭部和自身的實現文件之間的分裂吧):
@interface NSManagedObject (FirstLetter)
- (NSString *)uppercaseFirstLetterOfName;
@end
@implementation NSManagedObject (FirstLetter)
- (NSString *)uppercaseFirstLetterOfName {
[self willAccessValueForKey:@"uppercaseFirstLetterOfName"];
NSString *aString = [[self valueForKey:@"name"] uppercaseString];
// support UTF-16:
NSString *stringToReturn = [aString substringWithRange:[aString rangeOfComposedCharacterSequenceAtIndex:0]];
// OR no UTF-16 support:
//NSString *stringToReturn = [aString substringToIndex:1];
[self didAccessValueForKey:@"uppercaseFirstLetterOfName"];
return stringToReturn;
}
@end
此外,在這個版本中,不要忘記通過 'uppercaseFirstLetterOfName' 作爲sectionNameKeyPath:
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext
sectionNameKeyPath:@"uppercaseFirstLetterOfName" // this key defines the sections
cacheName:@"Root"];
而且,在UITableViewDataSource實施以取消tableView:titleForHeaderInSection:
:
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
return [sectionInfo name];
}
我試着把名字放在'sectionNameKeyPath'中,但是每個返回的名字都有一段。我獲得了與名稱一樣多的部分,每部分只有一個條目(名稱)。 – 2009-11-16 10:19:23
您可能沒有正確安裝。再讀一個答案。它像廣告一樣工作。 – 2009-11-16 10:33:34
我不相信答案本身就是「有效的」,我不知道爲什麼迴應者將第一個名字作爲關鍵路徑的行爲是一個奇蹟。 – refulgentis 2009-11-16 10:36:28