iPhone plist добавить новую строку в массив - PullRequest
0 голосов
/ 03 марта 2011

Я заполняю сборщик значениями из файла plist. формат plist как ниже.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>type</key>
    <array>
        <string>AAAA</string>
        <string>BBBBB</string>
        <string>CCCCC</string>
    </array>
</dict>
</plist>

В проекте, вызывающем этот словарь / массив для средства выбора, это прекрасно работает.

NSBundle *bundle = [NSBundle mainBundle];
NSString *plistPath = [bundle pathForResource:@"typecategory" ofType:@"plist"];
NSDictionary *dictionary = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
self.typeCategorySettings = dictionary;
[dictionary release];

NSArray *typeComponents = [self.typeCategorySettings allKeys];
NSArray *sorted = [typeComponents sortedArrayUsingSelector:@selector(compare:)];
self.typeCategory = sorted;

NSString *selectedTypeCategory = [self.typeCategory objectAtIndex:0];
NSArray *array = [typeCategorySettings objectForKey:selectedTypeCategory];
self.typeValues = array;

Вызов self.typeValues, как показано ниже

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
    return [self.typeValues count];

}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    return [self.typeValues objectAtIndex:row];
}

Но, кроме того, я добавил новый modalViewcontroller, чтобы добавить больше значений для выбора. С textField.text от modalviewcontroller

NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *path = [NSString stringWithFormat:@"%@/typecategory.plist",  documentsDirectory];
NSLog(@"path: %@", path);

NSDictionary *dictionary = [[NSDictionary alloc] initWithContentsOfFile:path];
//self.typeCategorySettings = dictionary;
//[dictionary release];

NSArray *typeComponents = [dictionary allKeys];
NSArray *sorted = [typeComponents sortedArrayUsingSelector:@selector(compare:)];
//self.typeCategory = sorted;

NSString *selectedTypeCategory = [sorted objectAtIndex:0];
NSMutableArray *array = [dictionary objectForKey:selectedTypeCategory];
NSString *plistt = textField.text;
NSLog(@"path: %@", plistt);
[array addObject:plistt];
[array writeToFile:path atomically:YES];

Целью вышеописанного метода является добавление «n» числа новых строк / строковых элементов в одном массиве. как показано ниже

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>type</key>
    <array>
        <string>AAAA</string>
        <string>BBBBB</string>
        <string>CCCCC</string>
                <string>DDDDD</string>

               <string>NNNNN</string>  
    </array>
</dict>
</plist>

Протестировано с симулятором и устройством. Но добавление новой строки в существующий массив не фиксируется в файле plist.

Консольный отчет здесь:

DataFile: ошибка открытия файла: /var/mobile/Library/Keyboard/en_GB-dynamic-text.dat, (В доступе отказано) 2011-03-03 22: 49: 05.028 TesApp [1562: 307] путь: /var/mobile/Applications/05074277-7E4D-4BC0-9CFA-XXXXXXXX/Documents/typecategory.plist 2011-03-03 22: 49: 05.031 TesApp [1562: 307] путь: DDDDD

Любое предложение, чтобы решить этот plist добавление строки в массив? ... а также любое простое решение для сборщика. Возможность добавить значения на ходу. Либо из базовых данных, либо из списка.

Буду признателен за помощь.

С уважением Devaski.

1 Ответ

3 голосов
/ 17 марта 2011

Решена вставка новой записи во время выполнения над структурой plist.

Шаг 1: Объявления заголовочного файла.

   NSMutableDictionary *typeCategorySettings;
   NSArray  *typeCategory;
   NSMutableArray *typeValues;

Шаг 2: Сохранение / запись новой записи в файл plist из текстового поля. Одна запись перед последней строкой

   NSError *error;
   NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
   NSString *documentsDirectory = [paths objectAtIndex:0];

   NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"typecategory.plist"];
   NSFileManager *fileManager = [NSFileManager defaultManager];

if (![fileManager fileExistsAtPath:filePath]) //4
{
    NSString *bundle = [[NSBundle mainBundle] pathForResource:@"typecategory" ofType:@"plist"]; //5

    [fileManager copyItemAtPath:bundle toPath:filePath error:&error]; //6
}


    NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];
    self.typeCategorySettings = dictionary;
    NSLog(@"Dictionary Read%@", self.typeCategorySettings);
    //[dictionary release];

    NSArray *typeComponents = [self.typeCategorySettings allKeys];
    NSMutableArray *sorted = [typeComponents sortedArrayUsingSelector:@selector(compare:)];
    self.typeCategory = sorted;
    NSLog(@"Array Read%@", self.typeCategory);

    NSString *selectedTypeCategory = [self.typeCategory objectAtIndex:0];
    NSMutableArray *array = [typeCategorySettings objectForKey:selectedTypeCategory];
    self.typeValues = array;
    NSLog(@"Values Read%@", self.typeValues);

            NSString *test;
    test = textField.text;
    [array insertObject:test atIndex:([self.typeValues count]-1)];
    [dictionary setObject:array forKey:@"type"]; 
    [dictionary writeToFile:filePath atomically:YES];
    NSLog(@"Written Read%@", dictionary);` 

Шаг 3: Чтение массива из Plist.

 NSError *error;

NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *plistPath = [documentsDirectory stringByAppendingPathComponent:@"typecategory.plist"];
NSFileManager *fileManager = [NSFileManager defaultManager];

if (![fileManager fileExistsAtPath:plistPath]) //4
{
    NSString *bundle = [[NSBundle mainBundle] pathForResource:@"typecategory" ofType:@"plist"]; //5

    [fileManager copyItemAtPath:bundle toPath:plistPath error:&error]; //6
}

//NSBundle *bundle = [NSBundle mainBundle];
//NSString *plistPath = [bundle pathForResource:@"typecategory" ofType:@"plist"];
NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];
self.typeCategorySettings = dictionary;

NSArray *typeComponents = [self.typeCategorySettings allKeys];
NSArray *sorted = [typeComponents sortedArrayUsingSelector:@selector(compare:)];
self.typeCategory = sorted;

NSString *selectedTypeCategory = [self.typeCategory objectAtIndex:0];
NSMutableArray *array = [typeCategorySettings objectForKey:selectedTypeCategory];
self.typeValues = array;
...