如何从带有sectionNameKeyPath的NSFetchedResultsController获取numberOfRowsInSection

iPh*_*Dev 2 core-data uitableview nsfetchedresultscontroller ios

我有一个属性为"group"的实体,因为我想通过"group"(0或1)将我的实体列表分成2个部分

@property (nonatomic, retain) NSNumber * group;
Run Code Online (Sandbox Code Playgroud)

在我的fetchedResultsController中,我将sectionNameKeyPath指定为"group"

self.fetchedResultsController = [[NSFetchedResultsController alloc] 
    initWithFetchRequest:request managedObjectContext:self.managedObjectContext 
    sectionNameKeyPath:@"group" cacheName:nil];
Run Code Online (Sandbox Code Playgroud)

如何在下面的方法中返回每个部分中的行数?我收到以下错误:

Terminating app due to uncaught exception 'NSRangeException', reason: 
'-[__NSArrayM objectAtIndex:]: index 1 beyond bounds for empty array'
Run Code Online (Sandbox Code Playgroud)

这是代码:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [[[self.fetchedResultsController sections] objectAtIndex:section] 
        numberOfObjects];
}
Run Code Online (Sandbox Code Playgroud)

我也尝试了这个,得到了同样的错误:

id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections]
    objectAtIndex:section];
return [sectionInfo numberOfObjects];
Run Code Online (Sandbox Code Playgroud)

请注意,我也实现了此方法:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 2;
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*uch 6

你实施了numberOfSectionsInTableView:吗?如果你没有实现它,tableView假定你有1个部分,如果fetchedResultsController没有任何部分(即它没有对象),这将导致这个异常.

你必须返回[sections count]在numberOfSectionsInTableView:.

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

如果您总是想要显示两个部分,则必须检查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;
}
Run Code Online (Sandbox Code Playgroud)

如果你在其他地方返回0以外的东西你也必须改变tableView:cellForRowAtIndexPath:.与此方法类似,您必须检查fetchedResultsController是否在请求的indexPath处有一个对象.