0

视图控制器有一个数据模型,它不断地、积极地更新

UItableview (storyTable) 经常被调用来更新和反映迄今为止的变化。

(更改代码以仅反映单个 beginUpdates endUpdates) - 仍然崩溃

  [self.storyTable beginUpdates];
                if([deleteIndexPaths count]){
                    DLog(@"Table refresh delele rows :%@",deleteIndexPaths);

                    [self.storyTable deleteRowsAtIndexPaths:deleteIndexPaths withRowAnimation:UITableViewRowAnimationNone];


                }

                if ([addIndexPaths count]){
                    DLog(@"Table refresh add rows :%@",addIndexPaths);

                    [self.storyTable insertRowsAtIndexPaths:addIndexPaths withRowAnimation:UITableViewRowAnimationTop];

                }
                if ([changedIndexPaths count]){

                    DLog(@"Table refresh change rows :%@",changedIndexPaths);
                    [self.storyTable reloadRowsAtIndexPaths:changedIndexPaths withRowAnimation:UITableViewRowAnimationFade ];

                }
                [self.storyTable endUpdates];
                //[self.storyTable endUpdates];
                tableIsAnimating = NO;

        }

不时崩溃并显示以下消息:(主要在 deleteRowsAtIndexPaths...)

* -[UITableView _endCellAnimationsWithContext:] 中的断言失败,/SourceCache/UIKit/UIKit-2380.17/UITableView.m:1070

由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效更新:第 0 节中的行数无效。更新后现有节中包含的行数 (20) 必须等于该节中包含的行数更新前的节 (20),加上或减去从该节插入或删除的行数(0 插入,10 删除),加上或减去移入或移出该节的行数(0 移入,0 移动出去)。'

或者 :

*由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“尝试将第 20 行插入第 0 节,但更新后第 0 节中只有 20 行”

问题:如何添加一些保护代码来防止崩溃?

4

2 回答 2

1

我认为这里的问题是,当同时删除、添加和更改混合时,您的 indexPaths 在第一个-endUpdates 之后将全部错误。

你可以试试这个:

[self.storyTable beginUpdates];
if([deleteIndexPaths count]){
   [self.storyTable deleteRowsAtIndexPaths:deleteIndexPaths withRowAnimation:UITableViewRowAnimationNone];
}
if ([addIndexPaths count]){
   [self.storyTable insertRowsAtIndexPaths:addIndexPaths withRowAnimation:UITableViewRowAnimationTop];
}
if ([changedIndexPaths count]){
   [self.storyTable reloadRowsAtIndexPaths:changedIndexPaths withRowAnimation:UITableViewRowAnimationFade ];
}
[self.storyTable endUpdates];

这样 indexPaths 将在所有操作中都有效。

于 2013-04-05T08:22:43.190 回答
-2

我认为你的 tableview 改变不是因为你 deleterowsatindexpath 而是 reloaddata,换句话说,使用 deleterowateindexpath 不会做基本的删除工作。

于 2014-03-06T07:37:55.180 回答