0

我有一个表格视图,其中包含许多我希望能够删除的行。填充 tableview 的数据存储在 NSMutableArray 中。要删除一行上的数据,我调用:

- (void)deleteFromArray:(NSUInteger) number{
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];  //load NSUserDefaults
    NSMutableArray *storedArray = [[ NSMutableArray alloc] init];
    storedArray = [prefs objectForKey: @"mydata"];
    [storedArray removeObjectAtIndex:number];

    [prefs setObject:storedArray forKey:@"mydata"];
    [storedArray release];
    [prefs synchronize];

}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        subscribe *subscribeclass = [subscribe alloc];
        [subscribeclass deleteFromArray: indexPath.row];
        [myTableView reloadData];
    }
}

这在我第一次删除一行时效果很好。但是当我删除第二行时,应用程序在 deleteFromArray 中的以下行崩溃:

[storedArray removeObjectAtIndex:number];

任何想法为什么?

4

3 回答 3

5

来自您的 NSUserDefaults 的数组是 NSArray,而不是 NSMutableArray。你应该修改你的代码是这样的:

- (void)deleteFromArray:(NSUInteger) number{
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];  //load NSUserDefaults
    NSMutableArray *storedArray = [[prefs objectForKey:@"mydata"] mutableCopy];
    [storedArray removeObjectAtIndex:number];

    [prefs setObject:storedArray forKey:@"mydata"];
    [storedArray release];
    [prefs synchronize];
}

这将创建不可变数组的副本并使其可变,以便您可以修改它。

于 2012-11-02T15:40:57.173 回答
1

您只能在默认值中存储不可变 NSArrays 的东西。即使对象是可变的,它也被存储为不可变的

所以而不是

 NSMutableArray *storedArray = [[ NSMutableArray alloc] init];
 storedArray = [prefs objectForKey: @"mydata"];

尝试:

 [NSMutableArray arrayWithArray:[prefs objectForKey: @"mydata"]];
于 2012-11-02T15:43:36.753 回答
0

问题是从 objectForKey 返回的数组是不可变的。所以你可以看到其他人做了什么:Storing custom objects in an NSMutableArray in NSUserDefaults

于 2012-11-02T15:41:14.180 回答