fetchedResultsController

fetchedResultsController

我有一个实体,其属性为“组”,因为我想按“组”将实体列表分为两部分(0或1)

@property (nonatomic, retain) NSNumber * group;

在我的fetchedResultsController中,将sectionNameKeyPath指定为“group”
self.fetchedResultsController = [[NSFetchedResultsController alloc]
    initWithFetchRequest:request managedObjectContext:self.managedObjectContext
    sectionNameKeyPath:@"group" cacheName:nil];

如何在下面的方法中返回每个节中的行数?我在下面出现错误:
Terminating app due to uncaught exception 'NSRangeException', reason:
'-[__NSArrayM objectAtIndex:]: index 1 beyond bounds for empty array'

这是代码:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [[[self.fetchedResultsController sections] objectAtIndex:section]
        numberOfObjects];
}

我也尝试了这个,得到了同样的错误:
id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections]
    objectAtIndex:section];
return [sectionInfo numberOfObjects];

请注意,我也实现了此方法:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 2;
}

最佳答案

您实现了numberOfSectionsInTableView:吗?如果未实现,则tableView假定您具有1个部分,如果fetchedResultsController没有任何部分(即,它没有对象),则将导致此异常。

您必须在[sections count]中返回numberOfSectionsInTableView:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return [self.fetchedResultsController.sections count];
}

如果始终要显示两个部分,则必须检查fetchedResultsController是否具有请求的部分。如果fetchedResultsController没有此部分,请不要要求它提供此操作中的对象数。
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 2;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSInteger count = 0;
    NSInteger realNumberOfSections = [self.fetchedResultsController.sections count];
    if (section < realNumberOfSections) {
        // fetchedResultsController has this section
        id <NSFetchedResultsSectionInfo> sectionInfo = [self.fetchedResultsController.sections objectAtIndex:section];
        count = [sectionInfo numberOfObjects];
    }
    else {
        // section not present in fetchedResultsController
        count = 0; // for empty section, or 1 if you want to show a "no objects" cell.
    }
    return count;
}

如果在else中返回0以外的值,则还必须更改tableView:cellForRowAtIndexPath:。与此方法类似,您必须检查fetchedResultsController是否在请求的indexPath处有一个对象。

10-08 12:26