在 – 断言失败
希望这将是一个快速解决。 我一直在试图找出我不断收到的错误。 错误列在下面,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
而不是viewDidLoad
。 viewDidAppear:animated
每当显示UITableView
调用viewDidAppear:animated
, viewDidLoad
只被调用一次。
删除行时,请记住它在更新时也检查部分,在:
- (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]; 修改数组值之后。