Зачем переопределять pListPath в didSelectRowAtIndexPath? - PullRequest
0 голосов
/ 24 октября 2011

Итак, я прочитал тонну SO-вопросов о списках и как их сохранить, и хотя я не знаю, почему ни одна iPhone-Dev-Book, которую я видел до сих пор, не покрывала это (все они использовалифункция редактирования tableView), мне удалось ДЕЙСТВИТЕЛЬНО записать в список, скопировав его в папку документов следующим образом:

pListPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
pListPath = [pListPath stringByAppendingPathComponent:@"piggyBanks.plist"];
NSLog(@"Path: %@", pListPath);

// if the file does not exist yet, create it, and copy the plist data into it, that can be found in the bundle 
NSFileManager *fileManager = [NSFileManager defaultManager];

if (![fileManager fileExistsAtPath:pListPath]) {
    NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"piggyBanks" ofType:@"plist"];
    [fileManager copyItemAtPath:sourcePath toPath:pListPath error:nil]; 
}

// make the plist content available for usage
pListContent = [[NSMutableDictionary alloc] initWithContentsOfFile:pListPath];
NSLog(@"pListContent: %@", pListContent);

Пока все хорошо, но теперь, если я хочу изменить некоторое значение plist, когдапользователь нажимает на tableViewCell (это пользовательский, если это важно), хотя pListPath, pListContent и другие являются свойствами, определенными в .h и синтезированными в .m, я должен переопределить pListPath и pListContentвнутри didSelectRowAtIndexPath, чтобы получить путь, который будет известен в тот момент.

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

Спасибо!

Ответы [ 2 ]

0 голосов
/ 27 октября 2011

Я гуглил переменные класса в задаче C и пробирался по разным статьям, пока не нашел этот блог / blogpost, который объясняет самого себя. и _underscore вещь действительно хорошо! Теперь я всегда объявляю свои Ivars с подчеркиванием, свойства без. Работает довольно хорошо. Подводя итог, почему ВСЕГДА используйте self.yourPropertiesName, вы вызываете метод (setter и getter)! И, как и любой другой метод, который вы вызываете, вы должны сказать, кто вызывает.

Надеюсь, это поможет кому-то еще:)

0 голосов
/ 24 октября 2011

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

if (!self.pListPath)    
{
    NSString *newPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    newPath = [newPath stringByAppendingPathComponent:@"piggyBanks.plist"];
    self.pListPath = newPath;
}

Затем затем используйте self.pListPath вместо pListPath.

Вам необходимо переустановить его, потому что на данный момент pListPath присваивается автоматически освобожденной строке, которая будет удалена к тому времени, когда она вам понадобится снова.Установка свойства (при условии, что свойство сохранено или скопировано) сохранит строку для вас.

...