由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序

Posted

技术标签:

【中文标题】由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序【英文标题】:Terminating app due to uncaught exception 'NSInternalInconsistencyException' at 【发布时间】:2014-03-13 14:58:19 【问题描述】:

我在以前接受的答案中搜索了类似的错误消息,但他们建议的只是在将任何行插入 UITableView 之前正确更新数据源(我认为我已经在这样做了)。我正在使用 UIRefreshControl (refreshControl) 来刷新我的 UITableView (myTable)。并且 numberOfRowsInSection 按预期返回表 (mainArray) 的数据数组的长度。尽管我似乎在开始向表中插入行之前更新了我的数组数据,但应用程序在 [self.myTable endUpdates] 处崩溃;行给我以下错误信息:

由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效更新:第0节中的行数无效。更新后现有节中包含的行数(15)必须等于行数更新前包含在该节中的行数 (10),加上或减去从该节插入或删除的行数(1 插入,0 删除),加上或减去移入或移出该节的行数(0 移入, 0 移出)。'

这是我的代码:

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

    return mainArray.count;


- (void)refresh:(UIRefreshControl *)refreshControl 

    dispatch_queue_t checkQueue = dispatch_queue_create("pull to refresh queue",NULL);

    dispatch_queue_t main = dispatch_get_main_queue();

    dispatch_async(checkQueue, ^


    NSError *error;

    jsonData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://someurlwithjsondata.json"]];

    if(jsonData != nil)
    

        newData = [NSJSONSerialization
                   JSONObjectWithData:jsonData
                   options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves
                   error:&error];

        if (error)
        

            [refreshControl endRefreshing];

        
        else
        

            NSArray *indexPathArray = [NSArray arrayWithObjects:[NSIndexPath indexPathForRow:mainArray.count-1 inSection:0], nil];


            NSMutableArray *values = newData[@"values"];

            for (NSMutableDictionary *value in values)
            

                [mainArray addObject:value];

            


            dispatch_async(main, ^


                [self.myTable beginUpdates];

                [self.myTable insertRowsAtIndexPaths:indexPathArray withRowAnimation:UITableViewRowAnimationTop];

                [self.myTable endUpdates];

                [refreshControl endRefreshing];

            );


        

    
    else
    

        [refreshControl endRefreshing];

    

);



【问题讨论】:

【参考方案1】:

问题很简单。当您重新加载表格时,您将 5 个对象添加到您的 mainArray,但您只通过 insertRowsAtIndexPaths: 在表格视图中插入一行。这些需要匹配。插入与添加到 mainArray 一样多的行。

【讨论】:

如何添加多行? [weakSelf.feedHomeTable insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:_FeedTitleR.count-15 inSection:0]] withRowAnimation:UITableViewRowAnimationTop];我得到了这个代码【参考方案2】:

您的代码很容易出错,因为您手动添加行。您也在自己编写异步代码。更好的方法是使用 AFNetworking 的成功块来填充“mainArray”并重新加载表,而不是使用您编写的所有代码。它看起来像这样:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

[manager GET:@"http://example.com/resources.json" 
  parameters:nil 
     success:^(AFHTTPRequestOperation *operation, id responseObject) 

            ///set mainArray
            [self.myTable beginUpdates];
            [self.myTable endUpdates];

    failure:^(AFHTTPRequestOperation *operation, NSError *error) 

            NSLog(@"Error: %@", error);

   ];

【讨论】:

以上是关于由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序的主要内容,如果未能解决你的问题,请参考以下文章

目标 C:由于未捕获的异常“NSInvalidArgumentException”而终止应用程序

由于未捕获的异常而终止应用程序 [UIImageView _isResizable]

由于未捕获的异常而终止应用程序,同时加载视图

由于未捕获的异常“NSInternalInconsistencyException”错误而终止应用程序

“由于未捕获的异常而终止应用程序”在推送视图控制器时崩溃

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,