1

我的目标是通过填充 fetchedResultsController 上所有获取结果的数据来填充 tableview 的一部分。这是非常简单的,就像一个魅力。

我的小应用程序的第二部分是在同一张表的另一部分添加属性“价格”。它工作正常。

这是我用来实现的:

 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 2;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

        // Return the number of rows in the section.
    if (section == 1) {
        return 1;

    } else return [self.fetchedResultsController.fetchedObjects count];  

}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

if (indexPath.section == 0) {
    static NSString *ci = @"CellTotal";

    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:ci];

    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:0];
    float expense = 0;
    for (NSManagedObject *object in [sectionInfo objects]) {
        expense += [[object valueForKey:@"precio"] floatValue];
    }


    cell.textLabel.text = [NSString stringWithFormat:@"%f", expense];

    return cell;

} else {
    static NSString *ci = @"Cell";

    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:ci];
    [self configureCell:cell atIndexPath:indexPath];   
    return cell;
}

}

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath{

Gastos *g = (Gastos *)[self.fetchedResultsController objectAtIndexPath:indexPath];
cell.detailTextLabel.text = g.nombre;

NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterDecimalStyle];
[f setMinimumFractionDigits:2];
[f setMaximumFractionDigits:2];

NSString *precio = [f stringFromNumber: g.precio];

cell.textLabel.text = precio;

}

当我想更改表格视图中各部分的顺序时,问题就出现了。如果我想在第 0 节中显示总添加量,在第 1 节中显示 fetchedresults 列表,那么我的应用程序会因错误而崩溃:

由于未捕获的异常“NSRangeException”而终止应用程序,原因:“ * -[__NSArrayM objectAtIndex:]: index 1 beyond bounds [0 .. 0]”

关于我做错了什么的任何想法?非常感谢任何帮助,谢谢!

更新 这是代码破坏应用程序的地方:

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath{

        Gastos *g = (Gastos *)[self.fetchedResultsController objectAtIndexPath:indexPath];

看起来像是在处理第一个获取的对象,但在第二个对象上失败了。我真的很纠结这个问题。我一直在调试,检查 fetch 控制器是否存在等,一切似乎都很好,但它坏了......我是一个菜鸟,不知道如何解决这个问题:-(

4

1 回答 1

2

您有一个包含 2 个部分的表格视图。第二部分由 FRC(只有一个部分)填充。因此,表格视图中的第 1部分对应于 FRC 中的第 0 部分。

您的configureCell:atIndexPath:方法使用表视图的 indexPath (section == 1)objectAtIndexPath调用,但必须使用 section == 0 调用。因此您必须像这样调整节号:

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
    NSIndexPath *frcIndexPath = [NSIndexPath indexPathForRow:indexPath.row inSection:(indexPath.section - 1)];
    Gastos *g = (Gastos *)[self.fetchedResultsController objectAtIndexPath:frcIndexPath];
}
于 2012-07-27T11:51:17.773 回答