Зачем переопределять pListPath в didSelectRowAtIndexPath?

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

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, чтобы путь был известен в этот момент.

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

Спасибо!


person Nareille    schedule 24.10.2011    source источник


Ответы (2)


Если plistPath является строковым свойством вашего класса, вам необходимо назначить его как таковое:

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

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

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

person jrturton    schedule 24.10.2011
comment
Эй, спасибо за ваш ответ. Я не уверен, понял ли я это. Я попробовал ваш способ (вы смешали что-то в строке 4, это должен быть newPath после = ), и на удивление это работает. Но разве это не объектная переменная, если я использую self.pListPath вместо переменной класса? Я ввел pListPath как @property (nonatomic, copy) NSString *pListPath;, а раньше использовал как assign. Кажется, я помню, как использовал другие типы без self. как переменная класса.. - person Nareille; 24.10.2011
comment
Спасибо за указание на опечатку, я обновил ответ. Я не уверен, что вы имеете в виду в отношении переменных класса и объекта - на самом деле это не термины, используемые в объективном C. Вы хотите, чтобы путь был переменной экземпляра, что и есть. Доступ к нему через self. просто означает, что вы проходите через аксессоры - особенно важно для установщика, потому что он сохраняет переменную для вас. - person jrturton; 24.10.2011
comment
Ну, я выучил это так, будто есть переменные класса и переменные объекта. Class V. одинаковы для всех объектов определенного класса, а Object Vs. различны для каждого объекта класса, хотя каждый объект обязательно имеет эту переменную. Класс против. вызываются просто по имени vars, а object Vs. получить вызов как self.varName, может быть, это меня смущает.. (Я исхожу из фона C++, думал, что это применимо и к objC). Значит, в objC все наоборот? Все с self.varName одинаково для каждого объекта класса, а varName без self. подобен объекту В.? - person Nareille; 24.10.2011
comment
Нет, это не то же самое в объективном C. Ближе всего к тому, что вы называете переменными класса, вероятно, статические переменные в объективном C. Я бы просмотрел введение в документацию по объективному C на сайте разработчика Apple, если бы я был на вашем месте, я вряд ли даст вам лучший ответ! - person jrturton; 24.10.2011

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

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

person Nareille    schedule 27.10.2011