Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 在重新加载RowsatindeXPath时崩溃,但在重新加载数据时不崩溃_Iphone_Uitableview - Fatal编程技术网

Iphone 在重新加载RowsatindeXPath时崩溃,但在重新加载数据时不崩溃

Iphone 在重新加载RowsatindeXPath时崩溃,但在重新加载数据时不崩溃,iphone,uitableview,Iphone,Uitableview,我有一个detailViewController和一个MasterViewController。MasterViewController是我拥有UITableView的地方。我的表格中有两个部分,顶部部分是项目列表,底部部分有一个条目@“添加新行” @“添加新行”转到detailViewController,可以在其中编辑UITextField。然后,当按下save时,我执行以下操作: - (IBAction)saveButtonPressed:(id)sender { if ([det

我有一个detailViewController和一个MasterViewController。MasterViewController是我拥有UITableView的地方。我的表格中有两个部分,顶部部分是项目列表,底部部分有一个条目@“添加新行”

@“添加新行”转到detailViewController,可以在其中编辑UITextField。然后,当按下save时,我执行以下操作:

- (IBAction)saveButtonPressed:(id)sender {
    if ([detailControllerDelegate respondsToSelector:@selector(setNewmap:)]) {
        if (self.textField.text.length > 0) {
            [self.textField endEditing:YES];
            [detailControllerDelegate setValue:self.textField.text forKey:@"newmap"];
            [self.navigationController popViewControllerAnimated:YES];
        }
    }
}
然后在MasterViewController中

- (void)setNewmap:(NSString *)newmap {
    if (![newmap isEqualToString:_newmap]) {
        _newmap = newmap;

        [self.maps addObject:_newmap];

        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[self.maps count] inSection:MAPS_SECTION];
        [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    }
}
它在重新加载RowsatindExpaths时崩溃,并显示以下消息:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'attempt to delete row 3 from section 0 which only contains 2 rows before the update'
我不知道为什么会这样。我认为,当您执行tableViewUpdates时,您将更新模型,这是我使用
self.maps addObject:newmap]所做的。我记录了计数,计数是正确的。更新模型后,我认为您可以自由地重新加载行

如果我不重新加载特定的行,而只是在tableView上调用reloadData,那么它不会崩溃。不知道这里有什么区别。这就像更新self.maps模型时,numberOfRowsInSection委托方法没有得到更新一样

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

在此方法中,您应该动态返回一个整数。在更新之前,您应该在节中获取新的行数并返回它。

数组或字典(在本例中为self.maps)的计数始终比其最后一项高一个,因为数组的索引为零:


nsindepath*indepath=[nsindepath indexPathForRow:[self.maps count]-1个分区:maps_节]

我知道这个问题提出已经有一段时间了,但我认为问题可能在于,reloadRowsAtIndexPaths依赖于表中这些行的先前存在,并在内部删除、重新创建和插入它们(在后台)。因此,当您在表中没有这些行的情况下调用特定的重载时,它会尝试删除不存在的行

我在集合视图中遇到了同样的问题。完全重新加载之所以有效,是因为它刷新了整个内容,并且不依赖于先前的状态,只依赖于数据源的当前状态


这是我对这个问题的看法。

如果重新加载不存在或根本不存在的行,可能会发生这种情况。

我目前通过使用该方法返回self.maps数组的计数来执行此操作。当我第一次遇到错误并尝试您建议的方法时,我认为可能也是这样,并且得到了相同的错误消息,除了将删除部分的3替换为2之外。因此它表示“尝试从更新前仅包含2行的节0中删除第2行”?这没有多大意义…我知道这就是为什么我如此困惑的原因。换一种方式说,如果您在
begin/endUpdates
中插入/删除行,则需要使用更新之前的索引路径调用
reloadRowsAtIndexPaths
。谢谢Nikhil!