Установка ivar в target-c с дочернего представления в iPhone - PullRequest
0 голосов
/ 31 марта 2010

Возможно FAQ на этом сайте.

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

Оба поля открывают новый TableViewController, включенный в UINavigationController.

Одиночное поле выбора (Оплачено) содержит объект Членство Поле множественного выбора (оплачено) содержит объект NSMutableArray

Обе переменные отправляются на новый контроллер одинаковым образом:

mySingleSelectController.crSelectedMember = self.crPaidByMember;
myMultipleSelectController.crSelectedMembers = self.crSelectedMembers;

Из Платного для контроллера я использую метод didSelectAtIndexPath, чтобы установить изменяемый массив Членств, за которые выплачивается:

 if ([[tableView cellForRowAtIndexPath:indexPath] accessoryType] == UITableViewCellAccessoryCheckmark) {
  [self.crSelectedMembers removeObject:[self.crGroupMembers objectAtIndex:indexPath.row]];
  //...
 }
 else {
  [self.crSelectedMembers addObject:[self.crGroupMembers objectAtIndex:indexPath.row]];
  //...
 }

Пока все идет хорошо. Изменяемый массив (crSelectedMembers) идеально устанавливается из дочернего представления. Но... У меня проблемы с настройкой объекта Членство.

Из оплаченного контроллера Я использую didSelectAtIndexPath, чтобы установить членство:

[self setCrSelectedMember:[crGroupMembers objectAtIndex:indexPath.row]];

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

Я что-то не так делаю? Потому что я могу вызвать метод crSelectedMembers, но не могу изменить значение crSelectedMember.

1 Ответ

0 голосов
/ 31 марта 2010

Если я понимаю ваш вопрос, наиболее вероятной причиной является неправильная декларация собственности.

Если вы хотите передать значения из одного объекта в другой, используя свойства каждого объекта, то вам нужно обязательно использовать assign, чтобы свойства в одном объекте указывали на те же экземпляры, что и свойство в другом объекте ,

Итак, в вашем topViewController у вас есть свойство:

@property (nonatomic,retain) NSString crSelectedMember;

Тогда в ваших дочерних контроллерах у вас есть:

@property (nonatomic,assign) NSString crSelectedMember;

Это вынуждает значение в точный объект в родительском контроллере.

Тем не менее, это очень хрупкий способ передачи данных между viewControllers. По мере усложнения вашего приложения будет невозможно отслеживать все переданные данные. (Хуже того, если вы столкнетесь с ограничениями памяти, родительский контроллер представления может выгружаться и даже не существовать при попытке передать ему данные.)

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

Подробности см. В этом сообщении: iPhone: как передавать данные между несколькими контроллерами представления в приложении с вкладками

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...