-1

我正在尝试从表格视图中删除多个选择。一切正常,直到我向上或向下滚动,然后它崩溃并引发异常。

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

对象不能为零

这就是我删除对象的方式:

- (IBAction)deleteObjects:(id)sender {

    NSArray *selectedRows = [self.tableView indexPathsForSelectedRows];

    BOOL deleteSpecificRows = selectedRows.count > 0;
    if (deleteSpecificRows)
    {
        NSMutableArray *stringsOfObjects = [NSMutableArray new];
        for (NSIndexPath *selectionIndex in selectedRows) {
            UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:selectionIndex];
            [stringsOfObjects addObject:cell.textLabel.text];
        }

        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *path = [paths objectAtIndex:0];
        NSString *plistPath = [path stringByAppendingPathComponent:@"AlertSubscriptions.plist"];
        NSMutableArray *array = [[[NSMutableArray alloc] initWithContentsOfFile:plistPath] mutableCopy];

        [array removeObjectsInArray:stringsOfObjects];
        [self.alertSubArray removeObjectsInArray:stringsOfObjects];
        [array writeToFile:plistPath atomically:YES];

     [self.tableView deleteRowsAtIndexPaths:selectedRows withRowAnimation:UITableViewRowAnimationAutomatic];
    }

同样,这一切都很好,除非我向上/向下滚动以选择/取消选择更多单元格,所以我将单元格子类化,因为我读到不会在 SO 上重用单元格。

以供参考:

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

SubscriptionsTableViewCell *cell = [tableView
                              dequeueReusableCellWithIdentifier:nil];
if (cell == nil) {
    cell = [[SubscriptionsTableViewCell alloc]
            initWithStyle:UITableViewCellStyleDefault
            reuseIdentifier:nil];
}

    cell.textLabel.text = [self.alertSubArray objectAtIndex:indexPath.row];
    cell.textLabel.textAlignment = NSTextAlignmentLeft;

    return cell;
}

我试过用静态单元和没有。我已经尝试将 dequeueReusableCellWithIdentifier 设置为静态单元格并且没有。滚动时都不起作用

static NSString *CellIdentifier = @"Cell";

错误日志:

2015-06-28 15:46:19.379  *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'
*** First throw call stack:
(0x186d3c2d8 0x1985680e4 0x186c234c0 0x10017e7d8 0x18b7b1404 0x18b79a4e0 0x18b7b0da0 0x18b7b0a2c 0x18b7a9f68 0x18b77d18c 0x18ba1e324 0x18b77b6a0 0x186cf4240 0x186cf34e4 0x186cf1594 0x186c1d2d4 0x1904336fc 0x18b7e2fac 0x1001646d4 0x198be6a08)
libc++abi.dylib: terminating with uncaught exception of type NSException

编辑 所以在尝试了其他人告诉我的事情之后,我做了以下事情:

设置异常断点。崩溃后填充的行是该[stringsOfObjects addObject:cell.textLabel.text];行。

我已经确保我的cellForRowAtIndexPath方法现在设置正确:

}

static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];

cell.backgroundColor = [UIColor whiteColor];
[self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];
[self.tableView setRowHeight:45];
cell.textLabel.text = [self.alertSubArray objectAtIndex:indexPath.row];
cell.textLabel.textAlignment = NSTextAlignmentLeft;

return cell;

}

在那之后,我在将对象添加到 NSMutableArray 时仍然会崩溃,所以我查看了调试器并确保我的 UITableViewCell 不像机器人提到的那样为零,看起来确实如此,但我不知道该去哪里从这里开始:因为在我看来它不是零

图像1

如您所见,我选择了 6 行,但它只添加了 2 个对象。我不知道为什么这如此困难,为什么有些人没有,为什么它为零?为什么我可以很好地删除它们而无需滚动选择更多?

4

1 回答 1

2

因此,在评论中进行了广泛讨论之后,问题似乎如下:

[stringsOfObjects addObject:cell.textLabel.text];方法中的逻辑deleteObjects:是错误的。这是因为它直接从单元格中获取文本,而不是从填充单元格的数组后备存储中获取。

单元格可以滚动到屏幕外并重新使用,因此其中的文本不再正确,事实上,单元格不再“存在”,因为它已被重复使用。如果单元格不“存在”,则会在文本字段所在的位置创建一个空单元格nil。请注意,细胞重复使用是一件好事;不要创建单元格,也不要重复使用它们,否则你会很快耗尽内存。

相反,从填充单元格本身的后备存储中获取文本,而不是直接从单元格中获取文本。我希望代码类似于:

[stringsOfObjects addObject:[self.alertSubArray objectAtIndex:selectionIndex.row]];

于 2015-06-28T23:26:37.447 回答