美文网首页
UITableView internal inconsisten

UITableView internal inconsisten

作者: 狂暴的土豆泥 | 来源:发表于2018-11-03 14:19 被阅读61次

    如果你遇到了以下错误:

    2018-11-03 14:07:00.005337+0800 Project[1149:330700] Status bar could not find cached time string image. Rendering in-process.
    2018-11-03 14:07:27.542022+0800 Project[1149:330700] *** Assertion failure in -[UITableView _setupCell:forEditing:atIndexPath:animated:updateSeparators:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3698.54.4/UITableView.m:13357
    2018-11-03 14:07:38.970077+0800 Project[1149:330700] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView internal inconsistency: indexPath cannot be nil in _setupCell:forEditing:atIndexPath:animated:updateSeparators:'
    *** First throw call stack:
    (0x184ba6d8c 0x183d605ec 0x184ba6bf8 0x185596fa0 0x18e88c05c 0x18e81a86c 0x18e81a544 0x1007ef140 0x18e91564c 0x18f1ef478 0x18f1ef3a8 0x18e91564c 0x18ea36870 0x18e91b700 0x18ea511a8 0x18e9989e0 0x18e98d890 0x18e98c1d0 0x18f16dd1c 0x18f1702c8 0x18f169368 0x184b4f404 0x184b4ec2c 0x184b4c79c 0x184a6cda8 0x186a52020 0x18ea8c758 0x10081a1a0 0x1844fdfc0)
    libc++abi.dylib: terminating with uncaught exception of type NSException
    

    那么通常会伴随着这样的打印:

    2018-11-03 14:06:59.758203+0800 Project[1149:330700] [Assert] UITableView internal inconsistency: _visibleRows and _visibleCells must be of same length. _visibleRows: {0, 2}; _visibleCells.count: 4, _visibleCells: (
        "<AllSceneTableCell: 0x150129400; baseClass = UITableViewCell; frame = (0 35; 375 114); autoresize = W; layer = <CALayer: 0x1c0435800>>",
        "<RoomListLastCell: 0x150164400; baseClass = UITableViewCell; frame = (0 185; 375 44); autoresize = W; layer = <CALayer: 0x1c0436820>>",
        "<AllSceneTableCell: 0x150129400; baseClass = UITableViewCell; frame = (0 35; 375 114); autoresize = W; layer = <CALayer: 0x1c0435800>>",
        "<RoomListLastCell: 0x150164400; baseClass = UITableViewCell; frame = (0 185; 375 44); autoresize = W; layer = <CALayer: 0x1c0436820>>"
    )
    

    意思是你在某时刻改动了cell的frame,但是并没有刷新它们,所以实际数据和显示出来的有差别。
    譬喻我的操作:

    - (void)updateTableCellHeight:(CGFloat)height atIndexPaht:(NSIndexPath *)indexPath {
        if (![self.cellHeightDic[indexPath] isEqualToNumber: @(height)]) {
            [self.cellHeightDic setObject:@(height) forKey:indexPath];
    //        [self.tableView reloadData];
            [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
        }
    }
    

    tableView的cell里嵌套了一个collectionView,而collectionView的item数目不定,所以cell的高度需要根据collectionView变化。而我代码里回调出来了高度,刷新了拥有collectionView的cell后,其他的cell可能因此改变了frame却没有刷新造成了问题。
    解决方法是把
    [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
    改成
    [self.tableView reloadData];

    相关文章

      网友评论

          本文标题:UITableView internal inconsisten

          本文链接:https://www.haomeiwen.com/subject/ulukxqtx.html