Почему не получается написать этот NSMutableArray в plist? - PullRequest
0 голосов
/ 27 апреля 2010

изм.

Привет, я пытаюсь записать NSMutableArray в список. Компилятор не показывает никаких ошибок, но все равно не пишет в список. Я пробовал это на реальном устройстве, а не только на симуляторе.

По сути, этот код делает то, что когда вы нажимаете accessoryView из UITableViewCell, он нажимает indexPath, редактирует NSMutableArray и пытается записать это NSMutableArray в список. Затем он перезагружает упомянутые массивы (из нескольких списков) и перезагружает данные в UITableView из массивов.

Код:

NSIndexPath *indexPath = [table indexPathForRowAtPoint:[[[event touchesForView:sender] anyObject] locationInView:table]];

[arrayFav removeObjectAtIndex:[arrayFav indexOfObject:[NSNumber numberWithInt:[[arraySub objectAtIndex:indexPath.row] intValue]]]];

NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *plistPath = [rootPath stringByAppendingPathComponent:@"arrayFav.plist"];
NSLog(@"%@ - %@", rootPath, plistPath); 


[arrayFav writeToFile:plistPath atomically:YES];    

// Reloads data into the arrays
[self loadDataFromPlists];

// Reloads data in tableView from arrays
[tableFarts reloadData];

CFShow () для массива после удаление одного из них показывает это:

<CFArray 0x6262110 [0x2c810a0]>{type = mutable-small, count = 4, values = (
    0 : <CFNumber 0x6502e10 [0x2c810a0]>{value = +3, type = kCFNumberSInt32Type}
    1 : <CFNumber 0x6239de0 [0x2c810a0]>{value = +8, type = kCFNumberSInt32Type}
    2 : <CFNumber 0x6239dc0 [0x2c810a0]>{value = +10, type = kCFNumberSInt32Type}
    3 : <CFNumber 0x6261420 [0x2c810a0]>{value = +40, type = kCFNumberSInt64Type}

DEBUG-INFO: writeToPlist показывает ДА, я пытался освободить все массивы перед их повторным заполнением, установив их на nil, установив atomically на NO.

Ответы [ 4 ]

3 голосов
/ 27 апреля 2010

Как обсуждалось в комментариях ниже, реальная проблема здесь заключается в том, что plist читается и записывается в два разных места. Где-то в приложении есть код, который читает файл в массив, подобный следующему:

NSString *plistFavPath = [[NSBundle mainBundle] pathForResource:@"arrayFav" 
                                                         ofType:@"plist"]; 
arrayFav = [[NSMutableArray alloc] initWithContentsOfFile:plistFavPath];

Эта логика считывает массив из пакета приложения, который предназначен только для чтения и является частью распределенного приложения. Позже, когда отредактированный массив сохраняется, используется код, подобный этому:

NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                          NSUserDomainMask,
                                                          YES) objectAtIndex:0];
NSString *plistPath = [rootPath 
                          stringByAppendingPathComponent:@"arrayFav.plist"];
NSLog(@"%@ - %@", rootPath, plistPath); 
[arrayFav writeToFile:plistPath atomically:YES];   

В результате получается, что обновленный файл записывается в каталог документов приложения, но никогда не читается оттуда, создавая впечатление, что файл не сохраняется правильно. Чтобы исправить это, вы должны изменить код, который читает файл, на тот же путь, по которому вы пишете.

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

3 голосов
/ 27 апреля 2010
[yourMutableArray writeToFile:fileName atomically:YES];

Это должно работать. NSMutableArray наследуется от NSArray, который имеет метод для записи в plist.

1 голос
/ 27 апреля 2010

writeToFile:atomically: не будет работать, если ваш массив содержит пользовательские объекты.

Если ваш массив содержит пользовательские объекты, которые не являются объектами Plist (NSArray, NSDictionary, NSString, NSNumber и т. Д.), Вы не сможете использовать этот метод. Этот метод работает только на объектах Plist.

Другой вариант - использовать протокол NSCoding и таким образом записывать свои объекты на диск.

0 голосов
/ 27 апреля 2010

Да

Посмотрите на Руководство по программированию списка свойств .

phoneNumbers - это NSMutableArray

- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender {
    NSString *error;
    NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *plistPath = [rootPath stringByAppendingPathComponent:@"Data.plist"];
    NSDictionary *plistDict = [NSDictionary dictionaryWithObjects:
            [NSArray arrayWithObjects: personName, phoneNumbers, nil]
            forKeys:[NSArray arrayWithObjects: @"Name", @"Phones", nil]];
    NSData *plistData = [NSPropertyListSerialization dataFromPropertyList:plistDict
                            format:NSPropertyListXMLFormat_v1_0
                            errorDescription:&error];
    if(plistData) {
        [plistData writeToFile:plistPath atomically:YES];
    }
    else {
        NSLog(error);
        [error release];
    }
    return NSTerminateNow;
}
...