removeObjectForKey не удаляет значение из.файл plist


Я разрабатываю приложение для iPhone, в котором у меня есть TableView,

Что я хочу сделать, так это по щелчку UITableViewCell я хочу удалить эти значения из plist, MOBILES.Brand.2 и MOBILES.Brand.5, если они существуют.плист, если их там нет .плист, то я хочу добавить его к моему .plist

Вот структура моего .плист:

: Вот мой фрагмент кода:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
       plistPath = [self getPlistPath];

//PlistDict is mutableDictionary contains the keys and values of .plist (of above image) 
if ([PlistDict valueForKeyPath:@"MOBILES.Brand.2"] != nil) { //if key and it's value exists in Filter.plist

//Delete Key from .plist...
                NSMutableDictionary *savedStock = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];
                [savedStock removeObjectForKey:@"MOBILES.Brand.2"];
                [savedStock removeObjectForKey:@"MOBILES.Brand.5"];
                [savedStock writeToFile:plistPath atomically:YES];

}else{



//Add Key to .plist
            NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];
            [data setValue:@"251" forKeyPath:@"MOBILES.Brand.2"];
            [data setValue:@"298" forKeyPath:@"MOBILES.Brand.5"];
            [data writeToFile:plistPath atomically:YES];

    }
}

-(NSString*)getPlistPath{

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"Filter.plist"];
    PlistDict = [NSMutableDictionary dictionaryWithContentsOfFile:path];

    return path;
}

После написания вышеуказанного фрагмента кода он не удаляет ключи из .plist но он добавляет ключ успешно, если нет существовавший.

Где я делаю ошибку ? пожалуйста, помогите и заранее спасибо.

1 2

1 ответ:

Проблема в том, что вы пытаетесь удалить, используя NSMutableDictionary keypath непосредственно используя removeObjectForKey, что требует exact key Не keypath, и вы предоставляете keypath. Используйте следующие NSMutableDictionary Category взятые из здесь

@interface NSMutableDictionary (Additions)
- (void)removeObjectForKeyPath: (NSString *)keyPath;
@end

@implementation NSMutableDictionary (Additions)

- (void)removeObjectForKeyPath: (NSString *)keyPath
{
    // Separate the key path
    NSArray * keyPathElements = [keyPath componentsSeparatedByString:@"."];
    // Drop the last element and rejoin the path
    NSUInteger numElements = [keyPathElements count];
    NSString * keyPathHead = [[keyPathElements subarrayWithRange:(NSRange){0, numElements - 1}] componentsJoinedByString:@"."];
    // Get the mutable dictionary represented by the path minus that last element
    NSMutableDictionary * tailContainer = [self valueForKeyPath:keyPathHead];
    // Remove the object represented by the last element
    [tailContainer removeObjectForKey:[keyPathElements lastObject]];
}

@end

Это должно работать на вас.

Способ - 2

Если вышеизложенное не работает, вы можете выполнить итерацию вашего словаря и, в частности, удалить объект для ключа.. Попробуйте

NSMutableDictionary *savedStock = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];

NSMutableDictionary *brand=[[savedStock objectForKey:@"MOBILES"] objectForKey:@"Brand"];

[brand removeObjectForKey:@"2"];
[brand removeObjectForKey:@"5"];

Ура.