断言失败 -[UITableView _endCellAnimationsWithContext]
Posted
技术标签:
【中文标题】断言失败 -[UITableView _endCellAnimationsWithContext]【英文标题】:Assertion Failure -[UITableView _endCellAnimationsWithContext] 【发布时间】:2013-10-14 10:08:06 【问题描述】:我正在解析一个 xml 文件并将其解析值放在一个表格视图中。表格视图只有一个部分。但我得到以下异常:
2013-10-14 15:21:57.250 tableview[6068:907] * -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit/UIKit-2380.17/UITableView.m:909 中的断言失败 2013-10-14 15:22:11.227 tableview[6068:907] 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“尝试将第 0 行插入第 0 节,但是更新后第 0 部分只有 0 行' ** 首先抛出调用堆栈: (0x33e752a3 0x3bcde97f 0x33e7515d 0x3474aab7 0x35cb0a9f 0x35de6b27 0x6a10f 0x69ce5 0x33dc6037 0x346dc599 0x6b54b 0x3478c0f5 0x33e4a683 0x33e49ee9 0x33e48cb7 0x33dbbebd 0x33dbbd49 0x379702eb 0x35cd1301 0x68bdd 0x68b64) libc++abi.dylib:终止调用抛出异常
代码是:
/**
The NSOperation "ParseOperation" calls addFiles: via NSNotification, on the main thread which in turn calls this method, with batches of parsed objects. The batch size is set via the kSizeOfEarthquakeBatch constant.
*/
- (void)addFilesToList:(NSArray *)files
NSInteger startingRow = [self.fileList count];
NSLog(@"STARTING ROW:%d",startingRow);
NSInteger fileCount = [files count];
NSLog(@"FILE COUNT : %d",fileCount);
NSMutableArray *indexPaths = [[NSMutableArray alloc] initWithCapacity:fileCount];
NSLog(@"INDEX PATHS:%@",indexPaths);
for (NSInteger row = startingRow; row < (startingRow + fileCount); row++)
NSLog(@"into for");
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:0];
NSLog(@"INDEXPAth %@",indexPath);
[indexPaths addObject:indexPath];
[self.fileList addObjectsFromArray:files];
NSLog(@"ADD objects");
NSLog(@"FILELIST:%@",self.fileList);
//GETTING EXCEPTION AT THIS LINE
[self.tableview insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationAutomatic];
#pragma mark - UITableViewDelegate\
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return 1;
// The number of rows is equal to the number of earthquakes in the array.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return [self.fileList count];
NSLog(@"NUMBER OF ROWS :%d",[self.fileList count]);
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *kFileCellID = @"Cell";
myTableCell *cell = (myTableCell *)[tableView dequeueReusableCellWithIdentifier:kFileCellID];
// Get the specific earthquake for this row.
fileList *file = (self.fileList)[indexPath.row];
[cell configureWithFile:file];
return cell;
【问题讨论】:
【参考方案1】:正在发生的事情是,您要在其中添加新单元格的 tableview 仍然不知道对 self.fileList 数组所做的更改。不幸的是,UIKit 添加新单元格并检查节数的顺序是您无法控制的。 但是为了解决这个问题,UItableview 的插入和删除操作需要包装在开始更新和结束更新方法调用上。
[self.tableView beginUpdates];
// Do all the insertRowAtIndexPath and all the changes to the data source array
[self.tableView endUpdates];
【讨论】:
【参考方案2】:就我而言,问题是我使用了两个 indexPath(indexPath,lastIndexPath)。但是对于 lastIndexPath.row 已经超出了我的数组 bound.solve 通过检查条件。希望这对某人有所帮助。
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, lastIndexPath, nil] withRowAnimation:UITableViewRowAnimationAutomatic];
【讨论】:
【参考方案3】:我在 API 调用后更新行。
尝试更新主线程内的行。 (因为所有 UI 更新都应该在主线程内完成)。
试试这个....
DispatchQueue.main.async
self.tableView.insertRows(at: [newIndexPath], with: .bottom)
【讨论】:
以上是关于断言失败 -[UITableView _endCellAnimationsWithContext]的主要内容,如果未能解决你的问题,请参考以下文章
断言行 5120 pos 12 失败:'child = _child' 不正确
错误:断言失败:!_debugDuringDeviceUpdate 不是真正的颤振
-[UICollectionView _endItemAnimations] 中的 UICollectionView 断言失败
断言失败:第 6075 行 pos 12:'child == _child':不正确
C-调试断言失败:_CrtIsValidHeapPointer(block)
UICollectionView 断言失败 -[UICollectionView _updateWithItems:tentativelyForReordering:]