我正在尝试使用多个查询来制作类似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
答案 0 :(得分:4)
在tableView:cellForRowAtIndexPath:
中添加或删除行不是一个好主意。这是因为在更新/重新加载表视图时会调用此方法。因此,当您在正在进行的更新中触发另一个更新时,可能会发生奇怪的事情。
通常的做法是使用方法tableView:willDisplayCell:forRowAtIndexPath:
在最后一个单元格显示时添加新行。
或者,使用scrollViewDidScroll
方法(来自UIScrollViewDelegate
),因为UITableView
是UIScrollView
的子类。热门SVPullToRefresh + SVInfiniteScrolling库使用此方法。
答案 1 :(得分:1)
您希望在[self.tableView beginUpdates];
和[self.tableView endUpdates];