在第 8 行之后插入新对象,应用程序在使用 NSMutableArray 滚动时崩溃

Inserting new object past row 8 the app crashes on scroll with NSMutableArray

我有一个应用程序可以完成它应该对 UITableView 的前 8 行执行的所有操作...添加第 9 行后(因此 table 视图必须滚动)应用程序崩溃...

我尝试了多种变体,但似乎没有任何效果...我可以根据需要多次向我的行添加单元格,但是一旦我 "fill" [=31] 中的第 9 行=],应用程序崩溃

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'

下面是一些代码,用于在 table 视图的行中生成信息(table数据是一个 NSMutable 数组,areaNumber.text 来自一个 customCell )

-(IBAction)save_area:(id)sender {

{
        UITableView *tableView = self.myTable;
        NSInteger sections = tableView.numberOfSections;
        NSMutableArray *cells = [[NSMutableArray alloc]  init];
        for (int section = 0; section < sections; section++) {
            NSInteger rows =  [tableView numberOfRowsInSection:section];
            for (int row = 0; row < rows; row++) {
                NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:section];
                SodTableCell *cell = [self.myTable cellForRowAtIndexPath:indexPath];//**here, for those cells not in current screen, cell is nil**
                [cells addObject:cell];

                [tabledata removeObjectAtIndex:indexPath.row];

                NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
                NSObject * object_areaNumber = [prefs objectForKey:@"tablerow_area_input_by_user"];

                if(object_areaNumber != nil){
                    [tabledata insertObject:cell.areaNumber.text atIndex:indexPath.row];
                }

                NSUserDefaults *save1 = [NSUserDefaults standardUserDefaults];
                [save1 setObject:self.tabledata forKey:@"tablerow_area_input_by_user"];
                [save1 synchronize];
                NSLog(@"From save button %@",[save1 valueForKey:@"tablerow_area_input_by_user"]);

            }
        }
    }
}

table 可以在 9 个单元格之外创建一行又一行,如果我想要的话,可以创建数百个,并且滚动有效......当我将信息填充到第 9 行并保存它时使用您在上面看到的代码输入的信息。任何帮助,非常感谢...

编辑

在我的 tableView cellForRowAtIndexPath:

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

SodTableCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];

if(cell == nil){
    cell = [[SodTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
}

if(indexPath.row >= tabledata.count && [self isEditing]){

    cell.areaNumber.text = @"new";

}else{

    cell.areaNumber.delegate = self;
    cell.areaNumber.text = [tabledata objectAtIndex:indexPath.row];

    NSUserDefaults *save1 = [NSUserDefaults standardUserDefaults];
    [save1 setObject:self.tabledata forKey:@"tablerow_area_input_by_user"];
    [save1 synchronize];
    NSLog(@"From cell configuration %@",[save1 valueForKey:@"tablerow_area_input_by_user"]);
}

return cell;
}

我不会谈论如何正确使用UITableView,我只是告诉你为什么会崩溃。

错误表明您正试图将 nil 对象插入数组。正如我猜测的那样,问题的根源是下面这行。

[tabledata insertObject:cell.areaNumber.text atIndex:indexPath.row];

要解决它,请在插入数组之前检查cell.areaNumber.text

if(object_areaNumber != nil && cell.areaNumber.text){
    [tabledata insertObject:cell.areaNumber.text atIndex:indexPath.row];
}

已解决

我已经查看了所有关于我对 UITableViews 和相关代码的误解的评论...

如果您查看以下内容 link(到我的 Vimeo 页面),您应该会看到一些漂亮的东西...

Working Example on Vimeo

我能够在原始问题中加载超过 8 个单元格(如原始问题中所述),甚至能够加载用户可以保存并稍后填写的空行! 一切都保存在 NSUserDefaults 中,可以保存、编辑或删除...

再次感谢您的帮助...当然,与那些仅仅指出我不知道自己在做什么的评论相比,真正对我有帮助的评论总是更受欢迎和更有建设性...