2

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

@property (nonatomic, retain) NSNumber * group;

在我的 fetchedResultsController 中,我将 sectionNameKeyPath 指定为“组”

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;
}
4

2 回答 2

6

你实施了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 处是否有对象。

于 2013-10-13T08:56:34.457 回答
1

迅速:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
   let section = fetchedResults.sections?[section]
   let sectionCnt = section?.numberOfObjects

   return sectionCnt!
}

首先获取部分。计算其中的对象数。

注意:为此,fetchedResults 对象必须知道如何将数据划分为部分!这是在获取请求时实现的。在这一行中,将用于划分部分的 CoreData 属性名称传递给它:

fetchedResults = NSFetchedResultsController(
    fetchRequest: fetchRequest, 
    managedObjectContext: managedContext,
    sectionNameKeyPath: "CD_Attribute_Name_GoesHere",
    cacheName:nil
)
于 2017-08-01T02:15:30.900 回答