如何按值(不是键)删除数组中的项

时间:2015-07-28 11:58:04

标签: ios objective-c arrays json

您好我有一个获取分区列表的方法,我需要在pickerview中显示分区列表。 以下是我收到的回复:

[{"NCR":[ "Caloocan", "Las Piñas", "Makati", "Malabon ", "Mandaluyong", "Manila", "Marikina", "Muntinlupa", "Navotas", "Parañaque", "Pasay", "Pasig", "Quezon", "San Juan", "Taguig", "Valenzuela", "Pateros"]}, "Abra", "Agusan del Norte", "Agusan del Sur", "Aklan", "Albay", "Antique", "Apayao", "Aurora", "Basilan", "Bataan", "Batanes", "Batangas", "Benguet", "Biliran", "Bohol", "Bukidnon", "Bulacan", "Cagayan", "Camarines Norte", "Camarines Sur", "Camiguin", "Capiz", "Catanduanes", "Cavite", "Cebu", "Compostela Valley", "Cotabato", "Davao del Norte", "Davao del Sur", "Davao Oriental", "Dinagat Islands", "Eastern Samar", "Guimaras", "Ifugao", "Ilocos Norte", "Ilocos Sur", "Iloilo", "Isabela", "Kalinga", "La Union", "Laguna", "Lanao del Norte", "Lanao del Sur", "Leyte", "Maguindanao", "Marinduque", "Masbate", "Metro Manila", "Misamis Occidental", "Misamis Oriental", "Mountain Province", "Negros Occidental", "Negros Oriental", "Northern Samar", "Nueva Ecija", "Nueva Vizcaya", "Occidental Mindoro", "Oriental Mindoro", "Palawan", "Pampanga", "Pangasinan", "Quezon", "Quirino"]

这是我到目前为止所做的:(在textFieldDidBeginEditing中调用)

else if(textField == _districtTextField)
{
    pickerComponentsArray = districtArray;
    [pickerView reloadAllComponents];
    [pickerView selectRow:0 inComponent:0 animated:YES];

    [textField setText:[districtArray objectAtIndex:0]];
    [textField setInputView:pickerViewContainer];
}

当我的代码到达[pickerView selectRow:0 inComponenet:0 animated:YES];我的应用程序崩溃了。这是我得到的错误:

[__ NSCFDictionary length]:无法识别的选择器发送到实例0x1744784c0 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [__ NSCFDictionary长度]:无法识别的选择器发送到实例0x1744784c0'

我怀疑这是因为嵌套数组。我如何解析我收到的jsonString。 我试过这样做:

pickerComponentsArray = districtArray;
NSMutableArray* mutableArray = [pickerComponentsArray mutableCopy];
for(int i=0;i<mutableArray.count;i++){
    NSMutableDictionary *outerDictionary = [mutableArray objectAtIndex:i];
    for(NSString *key in outerDictionary.allKeys){
        NSMutableDictionary *innerDictionary = [[outerDictionary objectForKey:key] mutableCopy];
        [innerDictionary removeObjectForKey:key];
    }

        [pickerView reloadAllComponents];
        [pickerView selectRow:0 inComponent:0 animated:YES];

        [textField setText:[districtArray objectAtIndex:0]];
        [textField setInputView:pickerViewContainer];

我仍然收到同样的错误。有没有办法解析json响应?我可以在@“NCR”键下删除值(Caloocan,Las Pinas等)吗?当删除卡片时,“NCR”键仍然是原始阵列(NCR,Abra等)的一部分吗? 谢谢!

1 个答案:

答案 0 :(得分:0)

我假设您使用数组“pickerComponentsArray”作为PickerView的数据源。 并且数组“districtArray”包含json字符串。

使用此算法清理pickerComponentsArray:

NSArray *pickerComponentsArray = districtArray;
NSMutableArray* mutableArray = [[NSMutableArray alloc]init];
for(int i = 0 ; i < pickerComponentsArray.count; i++){
    if ([[pickerComponentsArray[i] class] isSubclassOfClass:[NSDictionary class]]){
        NSDictionary *tmp = (NSDictionary *) pickerComponentsArray[i];
        [mutableArray addObjectsFromArray:[tmp allKeys]];
    } else {
        [mutableArray addObject:pickerComponentsArray[i]];
    }
}
pickerComponentsArray = [mutableArray copy];

[pickerView reloadAllComponents];
[pickerView selectRow:0 inComponent:0 animated:YES];

[textField setText:[districtArray objectAtIndex:0]]
[textField setInputView:pickerViewContainer];

我希望这会有所帮助。我只是快速地写了它,没有测试。

您基本上检查json数组中对象的类型。如果是字典,则只使用该字典的键。否则你只需使用json中的对象。