在 – 断言失败

希望这将是一个快速解决。 我一直在试图找出我不断收到的错误。 错误列在下面,appdelagate在下面。

任何帮助表示赞赏。

谢谢

2012-04-12 21:11:52.669 Chanda [75100:f803] —声明失败-[UITableView _endCellAnimationsWithContext:] ,/ /SourceCache/UIKit_Sim/UIKit-1914.84/UITableView.m:1037 -[UITableView _endCellAnimationsWithContext:] /SourceCache/UIKit_Sim/UIKit-1914.84/UITableView.m:1037 2012-04-12 21: 11:52.671 Chanda [75100:f803] —由于未捕获exception' NSInternalInconsistencyException ',原因:'无效更新:无效的行数在第0节。 )必须等于在更新之前在该部分中包含的行数(2),加上或减去从该部分插入或删除的行数(插入1个,删除0),加上或减去移入的行数或者在那个部分之外(0移进去,0移出)。

 #import "AppDelegate.h" @implementation AppDelegate @synthesize window = _window; @synthesize databaseName,databasePath; - (BOOL)application: (UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions { self.databaseName = @"Customers.db"; NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentDir = [documentPaths objectAtIndex:0]; self.databasePath = [documentDir stringByAppendingPathComponent:self.databaseName]; [self createAndCheckDatabase]; return YES; } - (void)createAndCheckDatabase { BOOL success; NSFileManager *fileManager = [NSFileManager defaultManager]; success = [fileManager fileExistsAtPath:databasePath]; if (success) return; NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:self.databaseName]; [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil]; } @end 

我没有看到你向我们展示这部分代码的原因。 您的错误必须连接到我假设的代码中的这部分

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

可能是你在这些数据源方法之一中犯了一个错误。 目前不可能说出究竟是什么错误,但我认为它可能是这样的:你在numberOfRowsInSection中告诉表视图,你想有n行保留和设置,然后在cellForRowAtIndexPath你只能处理n – 1行例。

对不起,这个答案不能像应该那样精确。 如果你向我们展示你的数据源的实现,那么告诉发生的事情会容易得多。

像孙子一样说 : 最好不战而胜 。 在我的情况下,每当我看到这种types的错误信息(即行之间的差异添加删除等)..我甚至不debugging任何..我只是避免进行额外的调用,我重新加载行等..这是99%的发生这种错误的情况。

这是发生这种错误的一个常见的情况:我有一个UINavigationController ,它有一个UITableView ,当我点击一行它推动一个新的UITableView等。 这个错误总是发生在我popup最后一个UITableview并回到UITableView之前,在这一点上,我做了一个不必要的调用loadIt函数,基本上插入行和重新UITableView

发生这种情况的原因是因为我错误地将我的loadIt函数放在viewDidAppear:animated而不是viewDidLoadviewDidAppear:animated每当显示UITableView调用viewDidAppear:animatedviewDidLoad只被调用一次。

删除行时,请记住它在更新时也检查部分,在:

 - (NSInteger)numberOfSectionsInTableView:(UITableView *)theTableView 

如果你想删除一个行中的最后一个项目,你需要删除整个部分,否则可能会得到错误的部分,并抛出此exception。

不要忘记更新你的数组,这决定了numberOfRowsInSection。 它需要更新之前,你animation和删除

我们检查部分中的行数是否为1,因为我们将不得不删除整个部分。

如果有人能使这个答案更清楚,请纠正我。

 [self.tableView beginUpdates]; if ([tableView numberOfRowsInSection:indexPath.section] == 1) { [tableView deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationFade]; } else { [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone]; } [self.tableView endUpdates]; 

我把每个部分的元素放在分开的数组中。 然后把它们放入另一个数组(arrayWithArray)。 我在这里解决这个问题的方法是

 [quarantineMessages removeObject : message]; [_tableView beginUpdates]; if([[arrayWithArray objectAtIndex: indPath.section] count] > 1) { [_tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indPath] withRowAnimation:UITableViewRowAnimationBottom]; } else { [_tableView deleteSections:[NSIndexSet indexSetWithIndex:indPath.section] withRowAnimation:UITableViewRowAnimationFade]; } [_tableView endUpdates]; 

我有同样的错误。

我正在使用以下几行

 UINib *myCustomCellNib = [UINib nibWithNibName:@"CustomNib" bundle:nil]; [tableView registerNib:myCustomCellNib forCellReuseIdentifier:@"CustomNib"]; 

在viewDidLoad方法中注册nib,因为我有一个与同一个类相关的不同的nib。 因此,线

 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"GBFBLoadingCell"]; 

除非我在viewDidLoad中注册了nib,否则返回nil。

我的问题是我忘了在我的文件“CustomNib.xib”和“CustomNib〜iphone.xib”的属性检查器中设置标识符。 (或者更确切地说,我忘了在XCode中的属性检查器中input标识符之后按回车键,这样新名称就不能保存了。)

希望这可以帮助。

我有同样的错误,当尝试[tableView reloadData]工作正常。 错误实际上是在线

 [TabView insertRowsAtIndexPaths:indexPathsArray withRowAnimation:UITableViewRowAnimationRight]; 

当我试图检查indexPath值,他们不正确的要求。

我通过更改indexPathsArray值来修复它。

希望这可以帮助 。

如果您使用的是像我这样的NSFetchedResultsController并在后台线程中更新数据,请不要忘记在代理中开始和结束更新:

 - (void)controllerWillChangeContent:(NSFetchedResultsController *)controller { [self.tableView beginUpdates]; } - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { [self.tableView endUpdates]; } 

我有一个核心数据库的问题。 如果你使用了很多FRC,你只需要在numberOfSectionsInTableView中的每个条件内重新加载tableview。

在使用Swift和FRC支持的数据存储来pipe理信息时,我只是遇到了这种情况。 添加一个简单的检查到删除操作来评估当前的indexPath.section允许我避免多余的电话。 我想我明白为什么会出现这个问题…基本上,当我的数据集是空的时候,我会加载一条消息到最上面一行。 这就造成了一个问题,因为有一个虚假的行。

我的解决scheme

 ... delete my entity, save the datastore and call reloadData on tableView //next I add this simple check to avoid calling deleteRows when the system (wrongly) determines that there is no section. if indexPath.section > 0 { tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .None) } 

它可能是UITableViewDataSource协议方法之一

对于

 - tableView:numberOfRowsInSection: 

它应该返回一个等于总和或结果的整数

-insertRowsAtIndexPaths:withRowAnimation:和/或-deleteRowsAtIndexPaths:withRowAnimation

对于

 - numberOfSectionsInTableView: 

它应该返回一个等于总和或结果的整数

-insertRowsAtIndexPaths:withRowAnimation:和/或-deleteSections:withRowAnimation:

只需检查一下你是否调用了[yourTableView reloadData]; 修改数组值之后。