Удалить элемент словаря из массива (plist) Cocoa Touch - PullRequest
0 голосов
/ 03 марта 2011

Эй, ребята, У меня есть этот список:

    <plist version="1.0">
    <dict>
        <key>Rows</key>
        <array>
            <dict>
                <key>FavTitle</key>
                <string>Book1</string>
                <key>Favourited</key>
                <string>duh</string>
                <key>SaveName</key>
                <string>book1.pdf</string>
            </dict>
            <dict>
                <key>FavTitle</key>
                <string>Book2</string>
                <key>Favourited</key>
                <string>duh</string>
                <key>SaveName</key>
                <string>book2.pdf</string>
            </dict>
        </array>
    </dict>
    </plist>

, который заполняет мой UITableView следующим образом:

cell.text = [dictionary objectForKey:@"FavTitle"];

(да, да, это устарело), ​​и когда ячейка выбрана, объекты моего словаря перемещаются в мое подробное представление (например, для установки заголовка и URL-адреса UIWebView) примерно так:

NSDictionary *dictionary = [self.tableDataSource objectAtIndex:indexPath.row];
        DetailViewController *dvController = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:[NSBundle mainBundle]];
        dvController.selectedSaveName = [dictionary objectForKey:@"SaveName"];
        dvController.selectedFavTitle = [dictionary objectForKey:@"FavTitle"];
        dvController.selectedFavourited = [dictionary objectForKey:@"Favourited"];
        [dvController setHidesBottomBarWhenPushed:YES];

        [self.navigationController pushViewController:dvController animated:YES];


        [dvController release];

Все отлично, и я могу добавить в этот массив, но как мне взять из него текущий загруженный словарь? Это не работает:

NSString *documentsDirectory = [[NSString alloc] initWithString:[[[[NSBundle mainBundle]  resourcePath] stringByDeletingLastPathComponent] stringByAppendingPathComponent:@"Documents/"]];
    NSString *writablePath = [documentsDirectory stringByAppendingPathComponent:@"Favourites.plist"];
    NSMutableDictionary *rootDict = [[NSMutableDictionary alloc] initWithContentsOfFile:writablePath];
    NSMutableDictionary *thisFav = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"duh", @"Favourited",
                                  selectedSaveName, @"SaveName",
                                  selectedFavTitle, @"FavTitle",
                                  nil];
    [[rootDict objectForKey:@"Rows"] removeObject:thisFav];      
    [rootDict writeToFile:writablePath atomically: YES];

Как я могу удалить запись со строкой 'Book2'? Последний опубликованный фрагмент не работает! Спасибо, ребята!

1 Ответ

0 голосов
/ 04 марта 2011

Вы не говорите, какую ошибку, если есть, вы получаете. Однако ваша проблема может быть с изменчивостью.

Когда вы читаете в plist в NSMutableDictionary, используя initWithContentsOfFile, только изменяемый словарь самого верхнего уровня, любые вложенные контейнеры являются неизменяемыми - в вашем случае массив Rows будет неизменным.

Чтобы сделать все это изменчивым, вам нужно использовать propertyListFromData:mutabilityOption:format:errorDescription: из NSPropertyListSerialization, передавая NSPropertyListMutableContainers или NSPropertyListMutableContainersAndLeaves в качестве опции изменчивости.

...