Помогите со словарем и списком - PullRequest
0 голосов
/ 19 июля 2011

У меня есть файл .plist, содержащий элемент словаря, что-то вроде этого:

<dict>
          <dict>
                     <key>Key one</key>
                     <string>string</string>
                     ...
          </dict>
          ...
</dict>

Как мне отредактировать строку первого ключа? Я застрял здесь:

NSString *pathVibrate = [NSString stringWithString:@"plist path"
NSMutableDictionary *plistDict = [[NSMutableDictionary alloc] initWithContentsOfFile:pathVibrate];

EDIT. Плист выглядит так: S

<dict>
          <key>Key One</key>
          <dict>
                     <key>Key one</key>
                     <string>string</string>
                     ...
          </dict>
          <key>Key Two</key>
          <dict>
                     <key>Key one</key>
                     <string>string</string>
                     ...
          </dict>
</dict>

Ответы [ 2 ]

2 голосов
/ 19 июля 2011

Не уверен на 100%, что я знаю, что вы после, вы имеете в виду, что вы хотите редактировать строку ключа или строку, хранящуюся в этом кете, я подозреваю, что последний ...

NSString *origString = [plistDict objectForKey:@"Key one"];
NSString *newString = [NSString stringWithFormat:@"Some change here to string =     %@",origString];
[plistDict setObject:newString forKey:@"Key one"]; // Will overwrite the original dictionary entry with the new string

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

NSMutableDictionary *subDictionary = [plistDict objectForKey:@"Key One"];
NSString *origString = [subDictionary objectForKey:@"Key one"];
NSString *newString = [NSString stringWithFormat:@"Some change here to string =     %@",origString];
[subDictionary setObject:newString forKey:@"Key one"]; // Will overwrite the original dictionary entry with the new string


subDictionary = [plistDict objectForKey:@"Key Two"];
NSString *origString = [subDictionary objectForKey:@"Key one"];
NSString *newString = [NSString stringWithFormat:@"Some other change here to string =     %@",origString];
[subDictionary setObject:newString forKey:@"Key one"]; // Will overwrite the original dictionary entry with the new string

Это то, что вы ищете? В этом случае я не уверен на 100%, но я не думаю, что plistDict должен быть объявлен как Mutable, поскольку сам корневой словарь не изменяется, только подсловарь.

Конечно, вы должны проверить, что указатель, возвращенный из [plistDict objectForKey: xxx], не равен nil, чтобы убедиться, что ключ действительно существует, прежде чем приступить к изменению результатов ...

NSMutableDictionary *subDictionary = [plistDict objectForKey:@"Key One"];
if(subDictionary!=nil)
{
    NSString *origString = [subDictionary objectForKey:@"Key one"];
    if(origString!=nil)
    {
        NSString *newString = [NSString stringWithFormat:@"Some other change here to string =     %@",origString];
        [subDictionary setObject:newString forKey:@"Key one"]; // Will overwrite the original dictionary entry with the new string
    }
}

Заметьте, я однажды прочитал в книге по Objective C, что в цели C недостаточно просто проверить указатель:

если (subDictionary) { }

как в булевом тестовом задании C только проверяет младшие 8 битов на ненулевое значение и игнорирует остальные биты в указателе, поэтому, если указатель находится на границе 256 байт, if возвращает false, когда он на самом деле правда. Возможно, это было решено в Objective-C 2.0, однако я всегда делаю длинную версию для безопасности.

1 голос
/ 21 июля 2011

Сохранить список просто, просто используйте

// for an array
BOOL result = [myArray writeToFile:filename atomically:YES];

// for a dictionary
BOOL result = [myDict writeToFile:filename atomically:YES];

// spot a pattern? :O)

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

Если вы не знакомы с классами NSDictionary и NSArray, стоит прочитать документацию по ним.Я также могу порекомендовать хорошую книгу под названием «Разработка iPhone 3 от Apress», которая является хорошим введением для начинающих (это то, с чего я начал несколько лет назад, и я уверен, что сейчас будет обновление 4.x).

...