根据索引从数组中删除对象

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中删除/更新数组对象中的指定索引

python 数组中如何根据值,获取索引,如何根据索引删除值 , 以及如何根据值删除值

从console.table()中删除索引