iOS/Objective-C:删除UserDefault中的数组项

iOS/Objective-C:删除UserDefault中的数组项,ios,objective-c,arrays,cocoa,nsuserdefaults,Ios,Objective C,Arrays,Cocoa,Nsuserdefaults,我在从保存在用户默认设置中的数组中删除项目时遇到问题 例如: 我在一张有8个名字的表格里列出了一个名单。当我选择一行时,它将存储在userdefault中,因为当我继续并返回时,它应该保持选中状态。这很好,但是当我取消选择该行时,它应该从UserDefaults中删除。我该怎么做 我以以下方式存储所选行: [selectedRow insertObject:[NSNumber numberWithInt:indexPath.row] atIndex:arrayIndex]; [userDef

我在从保存在用户默认设置中的数组中删除项目时遇到问题

例如: 我在一张有8个名字的表格里列出了一个名单。当我选择一行时,它将存储在userdefault中,因为当我继续并返回时,它应该保持选中状态。这很好,但是当我取消选择该行时,它应该从UserDefaults中删除。我该怎么做

我以以下方式存储所选行:

 [selectedRow insertObject:[NSNumber numberWithInt:indexPath.row] atIndex:arrayIndex];
 [userDefaults setObject:selectedRow forKey:@"sight_selectedRow"];
每当我选择一行时,arrayIndex变量都会递增。 该阵列的容量为8

我的想法是:当我按下第4行时,检查UserDefault数组项,是否有一个4?如果是,请删除此项目。但是我没有删除这个项目

谢谢:)


注意:我使用Xcode 5来代替insertObject,您可以使用数组的removeIndex属性来实现这一点。

我建议您始终维护一个包含8个对象的数组,并使用
-1
发出选择无效的信号

因此,当您首次启动且没有选择时,阵列为:

@[ @(-1), @(-1), @(-1), @(-1), @(-1), @(-1), @(-1), @(-1) ]
更新阵列时,使用以下方法替换(而不是插入)选择:

[selectedRow replaceObjectAtIndex:arrayIndex
                       withObject:@(indexPath.row])];
当然,对数组的任何单个更改都需要将整个数组写入用户默认值:

(你已经在做了)

我认为从长远来看,您会发现这种方法更简单,因为您不必担心数组超出了您的8个选择的限制。

尝试以下方法:

NSMutableArray *tempArray = (NSMutableArray*)[userDefaults objectForKey:@"sight_selectedRow"];;
[tempArray removeObject:unselectedRow];
[userDefaults setObject:tempArray forKey:@"sight_selectedRow"];

试试这个,这个对我有用。 为每个单元格选择make BOOL属性 如果isSelected==是,则将项添加到NSUserDefaults,否则为否

在您的方法
tableView:didSelectRowAtIndexPath:
中键入以下内容

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//your code
isSelected = !(isSelected);
}

如果你已经有了数组,我真的不明白是否需要将其保存在一个单独的数组中。在数组的开始循环中添加一个全局int值,该值将保留chekedItem的行,或者使用if-else语句或switch语句,因为你只有8个项,如果没有将chekedItem设置为0,请查看是否选择了某些项(数组中的第一项)…在didSelectRowAtIndexPath上设置chekedItem=indexPath.row。保存时,将该项保存在chekedItem索引下的数组中

开始时:

  NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];    
  NSString *unit = [userDefaults objectForKey:@"unit"];  
  if ([unit isEqualToString:@"Celsius"]) 
  {
      checkedCellIndex = 0;
  } 
  else 
  {
    checkedCellIndex = 1;
  } // i have just 2 elements in my array
didSelectRowAtIndexPath:

    checkedCellIndex  = indexPath.row;
    [tableViewUnits reloadData];
论储蓄

 NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];        
 switch (checkedCellIndex) {           
    case 0:   
        [userDefaults setObject:@"Celsius" forKey:@"unit"];
        break;   
    case 1:     
        [userDefaults setObject:@"Fahrenheit" forKey:@"unit"];
        break;            

    default:            
        break;

我想你误解了我的问题。这样做可以使技巧减半。但是如果我再次选择它,它总是会增加一个。例如:我选择它并取消选择它,用户默认值就消失了。正确。但是当我再次选择时,你会看到两个值。如果我再次选择,你会看到三个值,依此类推。这样做可以使技巧减半。但是如果我选择它,你会看到两个值ain,它总是再添加一个。例如:我选择它并取消选择它,userdefault值就消失了。正确。但当我再次选择时,您将看到两个值。如果我再次选择,您将看到三个值,依此类推。
    checkedCellIndex  = indexPath.row;
    [tableViewUnits reloadData];
 NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];        
 switch (checkedCellIndex) {           
    case 0:   
        [userDefaults setObject:@"Celsius" forKey:@"unit"];
        break;   
    case 1:     
        [userDefaults setObject:@"Fahrenheit" forKey:@"unit"];
        break;            

    default:            
        break;