ios核心数据到AZ索引的tableview

时间:2014-02-16 12:03:31

标签: ios core-data nsfetchedresultscontroller

我正在尝试根据我的属性上的第一个字母(类似于iOS地址簿应用程序)将我的核心数据模型的值显示到A-Z索引表。我的核心数据模型的“收藏夹”实体有2个属性:用户名和状态。我想只显示带有status = accepted的用户名到A-Z索引表。 这是我的代码:

- (NSFetchedResultsController *)fetchedResultsController {

if (fetchedResultsController != nil) {
    return fetchedResultsController;
}

NSManagedObjectContext *managedObjectContext = [self managedObjectContext];

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Favorites" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];

NSString *status = @"accepted";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"status == %@",status];
[fetchRequest setPredicate:predicate];

// Create the sort descriptors array.
NSSortDescriptor *usernameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"username" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:usernameDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];

// Create and initialize the fetch results controller.
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"username" cacheName:@"Root"];
self.fetchedResultsController = aFetchedResultsController;
fetchedResultsController.delegate = self;

return fetchedResultsController;
}

现在,当我尝试访问部分名称时,我得到(null)

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
 {
     NSLog(@"%@",[[[fetchedResultsController sections] objectAtIndex:section] name]);
     return [[[fetchedResultsController sections] objectAtIndex:section] name];
 }

另外,我用这种方式获取名称而不是第一个字符,以便将其显示为节标题。

2 个答案:

答案 0 :(得分:1)

您需要正确访问sectionsInfo对象:

id <NSFetchedResultsSectionInfo> info = 
    [fetchedResultsController sections][section];
return [info name];

但是,这将为您提供每个唯一名称的标题,可能不是您想要的。相反,您必须为您的实体提供瞬态属性,例如NSString *sectionIdentifier并为其编写一个getter,返回username属性的第一个字母。

如果希望A-Z的索引在表视图的右边缘向下运行,则还需要实现:

sectionIndexTitlesForTableView:
tableView:sectionForSectionIndexTitle:atIndex:

如果你的标题仍然有null,那么它们可能未在您的实体中设置或保留?也许你的结果为零?也许你的fetchedResultsController是nil?您的数据模型中存在许多缺陷,因此这似乎很有可能。

  • 您的实体名称Favorites是复数形式。这不符合逻辑,您应该将其命名为Favorite,因为一个实例仅描述了一个收藏夹。
  • 状态是一个效率非常低的字符串。相反,您应该使用数字并应用一些枚举方案。
  • 用户名是Favorite的属性。这似乎也非常混乱,因为大概你也有一个User实体,它有一个username属性。您应该使用关系对此进行建模。

答案 1 :(得分:0)

使用NSFetchedResultsController's sectionIndexTitles函数获取第一个char的数组