在UITableView中删除/插入行时出现NSInternalInconsistencyException [英] NSInternalInconsistencyException while deleting/inserting rows in UITableView

查看:131
本文介绍了在UITableView中删除/插入行时出现NSInternalInconsistencyException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我需要用tableView创建一个应用程序。现在我可以加载/重新加载表格中的所有数据。添加/删除操作tableView具有编辑模式。但问题是在这种模式下tableView显示标准的添加/删除按钮。但我不需要这个按钮。在Apple教程中,我找到了其他方法来添加/删除行,如下所示:


I need to create an app with tableView. For now I can just load/reload all data in my table. To add/delete operation tableView has editing mode. But the problem is that in this mode tableView shows standart add/delete buttons. But I don't need this buttons. In Apple tutorial I found other way to do add/delete row like this:

[data removeObjectAtIndex:0];
[data addObject:[[chooseTypeCell alloc]init]];
NSIndexPath *insertIndexPaths=[NSIndexPath indexPathForRow:[data count] inSection:0]; 
NSIndexPath *deleteIndexPaths=[NSIndexPath indexPathForRow:0 inSection:0];
[[self view] beginUpdates];
[[self view] insertRowsAtIndexPaths:[NSArray arrayWithObject:insertIndexPaths] withRowAnimation:UITableViewRowAnimationRight];
[[self view] deleteRowsAtIndexPaths:[NSArray arrayWithObject:deleteIndexPaths] withRowAnimation:UITableViewRowAnimationFade];
[[self view] endUpdates];

但它会导致错误=(。

由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效的表视图更新。应用程序已请求更新表视图,该更新与数据源提供的状态不一致。

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid table view update. The application has requested an update to the table view that is inconsistent with the state provided by the data source.'

在我的情况下,我正在使用UITableViewController的子类,它是UITableViewdataSource和UITableViewDelegate协议。在这个对象中,视图变量与我的UITableView连接。结果,UITableView连接唯一的控制器。在这个控制器中我定义了这些方法:

In my case I'm using object, which is subclass of UITableViewController, with UITableViewdataSource and UITableViewDelegate protocols. In this object the view variable is connected with my UITableView. As a result, UITableView connects with the only it's controller. In this controller I defined these methods:

#pragma mark - Table view data source

#######>>>>> right code =)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle
forRowAtIndexPath:(NSIndexPath *)indexPath

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section


#######>>>>> in comment section

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle
forRowAtIndexPath:(NSIndexPath *)indexPath

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath
toIndexPath:(NSIndexPath *)toIndexPath

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath

#######>>>>> without any code or cap

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index

- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath
toIndexPath:(NSIndexPath *)toIndexPath

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView

#pragma mark - Table view delegate

#######>>>>> right code =)

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath  
#######>>>>> in comment section

 - (NSIndexPath *)tableView:(UITableView *)tableView willDeselectRowAtIndexPath:(NSIndexPath *)indexPath 

 - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath

#######>>>>> without any code or cap

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath
*)indexPath

- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath
*)indexPath

- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath
*)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath

- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath

- (NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath

- (void)tableView:(UITableView *)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

任何想法有什么问题?

推荐答案

这样的错误:


断言失败 - [_UITableViewUpdateSupport _computeRowUpdates],/ SourceCache / UIKit / UIKit-1912.3 / UITableViewSupport.m:386
Termin ating app由于未捕获的异常'NSInternalInconsistencyException',原因:'无效的表视图
更新。应用程序已请求更新表视图
,这与数据源提供的状态不一致。'

Assertion failure in -[_UITableViewUpdateSupport _computeRowUpdates], /SourceCache/UIKit/UIKit-1912.3/UITableViewSupport.m:386 Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid table view update. The application has requested an update to the table view that is inconsistent with the state provided by the data source.'

可能会出现,因为您的UITable-Data类定义错误。
你需要注意这个方法:

May appear because your UITable-Data class is wrong defined. You need to pay your attention to this methods:


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

您还需要检查动画代码。所有索引必须取自结果数据结构

Also you need to check your animation code. All indexes must be taken from result data structure.

在Apple文档中:


动画块中的删除和重新加载操作指定
应删除原始表中的行和部分或重新加载$ ​​b $ b; insertions指定应将哪些行和部分添加到结果表中
。用于标识节和
行的索引路径遵循此模型。另一方面,在可变
数组中插入或删除项可能会影响用于
连续插入或删除操作的数组索引;例如,如果在某个索引处插入
项,则
数组中所有后续项的索引都会递增。

Deletion and reloading operations within an animation block specify which rows and sections in the original table should be removed or reloaded; insertions specify which rows and sections should be added to the resulting table. The index paths used to identify sections and rows follow this model. Inserting or removing an item in a mutable array, on the other hand, may affect the array index used for the successive insertion or removal operation; for example, if you insert an item at a certain index, the indexes of all subsequent items in the array are incremented.

就我而言: insertRowsAtIndexPaths 函数出现错误。因为我的所有更改(在我的数据中)都是在执行时应用的。我的UITableViewCell的新位置是([数据计数] -1)同时我只使用[数据计数]。

In my case: error arises in insertRowsAtIndexPaths function. Because all my changes (in my data) were applied by the time of execution. And new position of my UITableViewCell was ([data count]-1) meanwhile I used just [data count].

感谢您的关注=)。

这篇关于在UITableView中删除/插入行时出现NSInternalInconsistencyException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆