iOS/Objective-C:删除UserDefault中的数组项
我在从保存在用户默认设置中的数组中删除项目时遇到问题 例如: 我在一张有8个名字的表格里列出了一个名单。当我选择一行时,它将存储在userdefault中,因为当我继续并返回时,它应该保持选中状态。这很好,但是当我取消选择该行时,它应该从UserDefaults中删除。我该怎么做 我以以下方式存储所选行: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
[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;