NSFetchedResultsController - >如何实施部分?

时间:2013-02-02 16:52:18

标签: objective-c xcode uitableview sections nsfetchedresultscontroller

我在使用NSFetchedResultsController工作时遇到问题。我有一个实体,说'员工'和一个字符串属性,让我们说'名字'。现在我想使用NSFetchedResultsController在UITableView中显示所有员工的姓名......没问题,继承我的代码:

if (_fetchedResultsController == nil) {

    NSManagedObjectContext *moc = [appDelegate managedObjectContext];

    NSFetchRequest *request = [NSFetchRequest new];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Employee" inManagedObjectContext:moc];
    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];

    [request setEntity:entity];
    [request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];

    _fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:moc sectionNameKeyPath:@"name" cacheName:@"root"];

    NSError *error;
    [_fetchedResultsController performFetch:&error];

    if (error != nil) {
        NSLog(@"Error: %@", error.localizedDescription);
    }
}

但NSFetchedResultsController为每个实体创建一个部分。因此,当我有200名员工时,它会创建200个部分。为什么呢?

如何正确实施这些方法:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
   return [[_fetchedResultsController sections] count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
     // Return the number of rows in the section.
     return [[[_fetchedResultsController sections] objectAtIndex:section] numberOfObjects];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
         cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    // Configure the cell...

    cell.textLabel.text = [[_fetchedResultsController objectAtIndexPath:indexPath] valueForKey:@"name"];

    return cell;
}

我可以理解整个概念错了吗? [_fetchedResultsController部分]和[_fetchedResultsController sectionIndexTitles]之间的区别在哪里?

我希望你能帮助我,并提前致谢!

编辑:我忘了告诉你最重要的事情:我想让部分用'name'属性的第一个字母分隔。 (喜欢音乐APP)。

尼克

1 个答案:

答案 0 :(得分:0)

初始化NSFetchedResultsController时,将nil作为sectionNameKeyPath传递。

如果你通过name,你基本上会说“请为每个名字创建一个部分”。传递nil时,您告诉它只创建一个部分。

你的tableview方法实现对我来说是正确的。

[_fetchedResultsController sections]为您提供了一个包含对象的数组,您可以询问这些对象,例如节中的对象数量。相比之下,[_fetchedResultsController sectionIndexTitles]主要是因为你可以告诉NSFetchedResultsController使用哪个部分标题(即你将它设置为一个数组,每个部分有一个字符串)。在你的情况下,你可以忽略它。