89

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

任何帮助表示赞赏。

谢谢

2012-04-12 21:11:52.669 Chanda[75100:f803] --- 中的断言失败-[UITableView _endCellAnimationsWithContext:]/SourceCache/UIKit_Sim/UIKit-1914.84/UITableView.m:1037 2012-04-12 21:11:52.671 Chanda[75100:f803] --- 由于未捕获的异常而终止应用程序“ NSInternalInconsistencyException” , 原因:'无效更新:第 0 节中的行数无效。更新 (2) 后现有节中包含的行数必须等于更新前该节中包含的行数 (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
4

12 回答 12

43

我看不出你向我们展示这部分代码的原因。我假设您的错误必须与您的代码中的这一部分有关

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

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

您可能在其中一种数据源方法中犯了错误。目前无法说出究竟出了什么问题,但我认为它可能是这样的:您告诉表格视图中的numberOfRowsInSection您希望保留和设置ncellForRowAtIndexPath行,然后您只处理n - 1行。

对不起,这个答案不能像它应该的那样精确。如果您向我们展示您的数据源的实现,那么您会更容易知道发生了什么。

于 2012-06-14T07:50:47.073 回答
26

正如孙子所说不战而胜。在我的情况下,每当我看到这种错误消息(即添加删除的行之间的差异等)..我什至不调试任何东西..我只是避免在重新加载行等的地方进行额外的调用..这是 99%发生此错误的情况。

这是发生此错误的常见情况:我有 aUINavigationController并且它有 a UITableView,当我单击一行时,它会推送一个新的UITableView等等。当我弹出最后一个UITableview并返回到它UITableView之前的时候,这个错误总是发生在我身上,此时我对loadIt基本上插入行并重新加载UITableView.

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

于 2013-04-02T12:33:31.943 回答
25

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

- (NSInteger)numberOfSectionsInTableView:(UITableView *)theTableView

如果要删除作为部分中最后一项的行,则需要删除整个部分(否则可能会导致部分计数错误并引发此异常)。

于 2013-01-04T16:42:07.757 回答
6

不要忘记更新确定 numberOfRowsInSection 的数组。在制作动画和删除之前需要对其进行更新

我们检查节中的行数是否为 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];
于 2014-11-12T11:44:06.063 回答
4

我将每个部分元素放在单独的数组中。然后将它们放入另一个数组(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];
于 2013-03-29T11:48:34.753 回答
2

我有同样的错误。

我正在使用以下几行

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

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

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

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

我的问题是我忘记在属性检查器中为我的文件“CustomNib.xib”和“CustomNib~iphone.xib”设置标识符。(或者更准确地说,我在 XCode 的属性检查器中输入标识符后忘记按 Enter 键,因此新名称无法保存。)

希望这可以帮助。

于 2013-06-17T22:23:59.047 回答
2

如果您正在使用NSFetchedResultsController类似我并在后台线程中更新数据,请不要忘记在委托中开始和结束更新:

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

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    [self.tableView endUpdates];
}
于 2016-01-22T23:59:51.090 回答
2

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

[TabView insertRowsAtIndexPaths:indexPathsArray withRowAnimation:UITableViewRowAnimationRight];

当我尝试检查 indexPath 值时,它们不符合要求。

我通过更改indexPathsArray.

希望这可以帮助 。

于 2016-05-31T11:45:27.510 回答
1

它可能是UITableViewDataSource协议方法之一

为了

- tableView:numberOfRowsInSection:

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

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

为了

- numberOfSectionsInTableView:

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

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

于 2016-01-17T07:30:22.660 回答
0

我对核心数据库有同样的问题。如果您使用许多 FRC,您只需在 numberOfSectionsInTableView 中的每个条件内重新加载 tableview。

于 2013-10-30T04:39:03.887 回答
0

我刚刚在使用 Swift 和 FRC 支持的数据存储来管理信息时发生了这种情况。在删除操作中添加一个简单的检查来评估当前的 indexPath.section 让我避免了无关的调用。我想我明白为什么会出现这个问题......基本上,只要我的数据集为空,我就会将一条消息加载到第一行。由于存在虚假行,因此这会产生一个问题。

我的解决方案

... 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)

            }
于 2015-02-22T03:33:56.787 回答
0

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

于 2016-04-07T14:26:45.743 回答