根据索引从数组中删除对象
Posted
技术标签:
【中文标题】根据索引从数组中删除对象【英文标题】:removeObject from array based on index 【发布时间】:2012-05-29 19:53:43 【问题描述】:您好,我有一个带有 IBAction 的 viewController,可以将字符串添加到 Plist NSMutableArray。
这个 Plist 然后被读入另一个 viewController,它是一个 tableView。 Plist 数组中的此字符串使用字符串“1”(不带引号)填充自定义单元格中的文本字段。这基本上是一个购物篮系统,在这种情况下,用户将产品添加到购物篮中,将 1 字符串添加到填充 qty 文本字段的 qty 数组。这些 qty 文本字段会动态添加到购物篮视图中,因此在很多情况下,我会有很多行包含其中包含字符串“1”的文本字段。
现在我遇到的问题是,当按下将产品添加到购物篮的按钮时,我在 alertView 上有另一个按钮可以从 plist 中删除产品。问题是我添加了这样的字符串
NSString *string = @"1";
[enteredQty2 addObject:string];
NSArray *paths4 = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory4 = [paths4 objectAtIndex:0];
NSString *path4 = [documentsDirectory4 stringByAppendingPathComponent:@"qty.plist"];
[enteredQty2 writeToFile:path4 atomically:YES];
并像这样删除字符串
NSString *string = @"1";
[enteredQty2 removeObject:string];
NSArray *paths4 = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory4 = [paths4 objectAtIndex:0];
NSString *path4 = [documentsDirectory4 stringByAppendingPathComponent:@"qty.plist"];
[enteredQty2 writeToFile:path4 atomically:YES];
我遇到的问题是,如果我有几件物品添加到购物篮中,它们最初的数量字符串都是“1”。那么当我删除对象时会发生什么,它会从所有 qtyTextFields 中删除“1”,而不仅仅是所选的相关产品。当然,QtyTextFields 会根据用户想要的数量而变化,因此从数组中删除“1”,假设数量“12”将无效。
我不确定当我添加字符串“1”并使用选定标签删除项目时,最好的方法是什么。当然这些标签必须是动态的和唯一的?
非常感谢任何帮助
【问题讨论】:
【参考方案1】:您的数组可能应该包含NSDictionary
对象而不是NSString
。也许像下面这样?
NSDictionary *item = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:1], @"quantity",
@"yourUniqueProductId", @"id",
@"My Cool Product", @"title", nil];
然后您可以将该项目添加到数组中:
[enteredQty2 addObject:item];
要删除一个项目,你可以遍历数组:
for (NSDictionary *item in enteredQty2)
if ([[item objectForKey:@"id"] isEqualToString:@"yourUniqueProductId"])
[enteredQty2 removeObject:item];
break;
【讨论】:
感谢您的回复,当我单击按钮时它会导致应用程序崩溃,日志只是说 [__NSCFDictionary intValue]: unrecognized selector sent to instance 0xa170310' 该代码绝对只是一个示例,需要针对您的特定目的进行调整。但是哪个按钮给出了错误?添加或删除项目? 嗨@Josh 它添加了崩溃的项目。如果我检查 plist 它创建了字典和键但崩溃了。感谢您的帮助! 嗯。我不确定那里发生了什么。你能在你的代码中设置一个断点,然后逐步告诉我是哪一行导致了崩溃吗? 抱歉,这是我的代码的一部分导致它崩溃。我仍然存在的唯一问题是我只将 NSnumber 1 和密钥数量添加到字典中。现在,当我在 for 循环中删除它时,如何识别每个文本字段的每个 1。即如果 objectForKey = @"quantity" 它会删除所有 NSnumber 1 我将如何确定我要删除哪一个?当然,用户可能已将数量编号更改为任何数字,而不仅仅是 1【参考方案2】:好吧,您遇到了一个问题,即 NSString 缓存了非常短的相同字符串,并且即使您创建了两次也会返回相同的对象。然后,当您调用 removeObject 时,它会找到同一对象的多个副本,因此将它们全部删除。
这应该适合你:
// Returns the lowest index whose corresponding array value is equal to a given object
NSInteger index = [enteredQty2 indexOfObject:string];
// delete the object at index
if (index != NSNotFound)
[enteredQty2 removeObjectAtIndex:index];
【讨论】:
以上是关于根据索引从数组中删除对象的主要内容,如果未能解决你的问题,请参考以下文章
如何使用flutter从firestore中删除/更新数组对象中的指定索引