insertRowsAtIndexPaths索引3超出endUpdates的边界

时间:2014-11-25 17:00:21

标签: ios objective-c uitableview core-data nsfetchedresultscontroller

我正在尝试使用多个查询来制作类似NSFetchedResultsController的内容。我打算获取数据并将结果保存到NSArray。但每当我尝试快速滚动时,endUpdates会将索引3提升到超出边界异常之外。

以下代码是向阵列添加更多人的代码。我在为最后一个元素调用cellForRowAtIndexPath时调用此方法。如果我做错了,请告诉我。

self.persons是我的数据源

    NSMutableArray *newPeople = [NSMutableArray new];

    NSArray *popular = [self fetchFewPopular];
    [newPeople addObjectsFromArray:popular];

    NSArray *randoms = [self fetchFewRandoms];
    [newPeople addObjectsFromArray:randoms];

    NSArray *reminders = [self fetchFewRandoms];
    [newPeople addObjectsFromArray:reminders];

    [self shuffleArray:newPeople];

    [self.tableView beginUpdates];

    NSMutableArray *insertingRows = [NSMutableArray new];
    [self.persons addObjectsFromArray:newPeople];

    for (Person *newPerson in newPeople) {
        [insertingRows addObject:[NSIndexPath indexPathForRow:[self.persons indexOfObject:newPerson] inSection:0]];
    }
    [self.tableView insertRowsAtIndexPaths:insertingRows withRowAnimation:UITableViewRowAnimationNone];
    [self.tableView endUpdates];
    for (Person*person in newPeople) {
        [self.personObjectIDS addObject:person.objectID];
    }

异常的堆栈跟踪:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 3 beyond bounds [0 ..
     

2]”   ***第一次抛出调用堆栈:(0 CoreFoundation __exceptionPreprocess + 165 1 libobjc.A.dylib
  objc_exception_throw + 45 2 CoreFoundation
   - [__ NSArrayM objectAtIndex:] + 227 3 UIKit
   - [_ UITableViewUpdateSupport(私人)   _setupAnimationsForExistingVisibleCells] + 296 4 UIKit - [_ UITableViewUpdateSupport _setupAnimations] + 151     5 UIKit
   - [UITableView _updateWithItems:updateSupport:] + 1812 6 UIKit - [UITableView _endCellAnimationsWithContext:] +   11935 7 Touchiq 0x00

2 个答案:

答案 0 :(得分:4)

tableView:cellForRowAtIndexPath:中添加或删除行不是一个好主意。这是因为在更新/重新加载表视图时会调用此方法。因此,当您在正在进行的更新中触发另一个更新时,可能会发生奇怪的事情。

通常的做法是使用方法tableView:willDisplayCell:forRowAtIndexPath:在最后一个单元格显示时添加新行。

或者,使用scrollViewDidScroll方法(来自UIScrollViewDelegate),因为UITableViewUIScrollView的子类。热门SVPullToRefresh + SVInfiniteScrolling库使用此方法。

答案 1 :(得分:1)

您希望在[self.tableView beginUpdates];[self.tableView endUpdates];

之间更新数据源