numberOfRowsInSection 中 fetchedResultsController 的奇怪行为

Posted

技术标签:

【中文标题】numberOfRowsInSection 中 fetchedResultsController 的奇怪行为【英文标题】:Weird behaviour with fetchedResultsController in numberOfRowsInSection 【发布时间】:2012-07-18 11:29:36 【问题描述】:

我的目标是通过填充来自 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:]: 索引 1 超出范围 [0 .. 0]'

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

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

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

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

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

【问题讨论】:

从技术上讲,您有一个包含一个元素的数组(在索引 #0 处),并且您正在请求索引 #1 处的元素。但是,我只在您发布的代码中看到objectAtIndex:0,所以我不确定它来自哪里。也许您可以使用调试器来发现哪条线出错了。 如果我将行替换为: id sectionInfo = [[self.fetchedResultsController section] objectAtIndex:indexPath.row]; *** 由于未捕获的异常“NSRangeException”而终止应用程序,原因:“*** -[__NSArrayM objectAtIndex:]: index 1 beyond bounds [0 .. 0]” 真正的问题是为什么它在 uitableview 第 0 节上运行正常,而不在第 1 节上运行正常? 似乎您从numberOfRowsInSection: 返回的值可能是倒退的。您是说在第 0 节中有 count 行,在第 1 节中有 1 行,但是您配置单元格的逻辑看起来并不匹配。 嘿菲利普,我添加了一个更新,详细说明了它为什么以及在哪里中断,但仍然在为结果苦苦挣扎:_( 【参考方案1】:

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

configureCell:atIndexPath: 方法是使用 table view 的 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];

【讨论】:

感谢马丁的帮助;) 这也是我的问题!

以上是关于numberOfRowsInSection 中 fetchedResultsController 的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

对成员 '(_:numberOfRowsInSection:)' 的模糊引用

UITableViewController 中 numberOfRowsInSection 中的 section 值始终为 1

动态 NumberOfRowsInSection

如何在 RxSwift 中使用 tableView 数据源(numberOfRowsInSection)?

UITableView 和 numberOfRowsInSection 崩溃

数组未与 tableView(numberOfRowsInSection) 方法连接