您好我有一个带有IBAction的viewController,它将一个字符串添加到Plist NSMutableArray。
然后将此Plist读入另一个viewView,它是一个tableView。 Plist数组中的此字符串使用字符串“1”(不带引号)填充自定义单元格中的textField。这基本上是一个篮子系统,用户在篮子中添加产品,在这种情况下,将1个字符串添加到填充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];
我遇到的问题是,如果我在篮子中添加了几个项目,那么他们最初的qty字符串为“1”。那么当我删除对象时会发生什么,它会从所有qtyTextField中删除“1”而不仅仅是所选的产品。当然,QtyTextFields会根据用户想要的QTY进行更改,因此从数组中删除“1”会让QTY“12”无效。
我不确定最佳方法是什么,当我添加它并使用所选标签删除项目时,我应该以某种方式标记字符串“1”。当然这些标签必须是动态且独特的吗?
任何帮助真的很感激
答案 0 :(得分:0)
您的数组应该包含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;
}
}
答案 1 :(得分:0)
好吧,你遇到了一个问题,即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];
}