对于大量更新的模型崩溃的deleteRowsAtIndexPaths

时间:2013-04-05 08:17:21

标签: iphone ios objective-c ipad uitableview

视图控制器具有可持续且积极地更新的数据模型

经常调用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行   更新

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

2 个答案:

答案 0 :(得分:1)

我认为这里的问题是,当同时删除,添加和更改混合时,在首次使用-endUpdates之后,indexPaths将全部出错。

你可以试试这个:

[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将在所有操作中有效。

答案 1 :(得分:-2)

我认为你的tableview更改不是因为你删除了或者是reloaddata,而是使用deleterowateindexpath而不执行基本的删除工作。