Добавить объект в NSMutableArray из другого класса - PullRequest
2 голосов
/ 18 мая 2011

У меня есть класс контроллера представления с именем PresidentsViewController, который устанавливает данные в UITableView. Эти данные имеют вид NSMutableArray, называемый list. У меня есть другой класс, PresidentAddController, который должен обрабатывать добавление объекта типа President в этот список на основе введенных пользователем данных о президенте. Тем не менее, я не могу получить объект для добавления в список. Я подтвердил, что введенные пользователем данные для нового президента собираются правильно, поэтому он добавляет в список другого класса, что вызывает проблемы. Я считаю, что правильный код для добавления объекта в список:

[pvc.list addObject:newPresident];

Однако я не знаю, как правильно создать ссылку / экземпляр /? (то, что было бы ПВХ) для PresidentsViewController внутри PresidentAddController, чтобы я мог правильно добавить нового президента в список. Я не использую Interface Builder для этого, потому что это просто UITableView.

Как мне добавить президента в список в этой ситуации?

Редактировать: Вот как инициализируется массив:

@property (nonatomic, retain) NSMutableArray *list;

А вот как настраивается PresidentAddController в PresidentsViewController:

PresidentAddController *childController = [[PresidentAddController alloc] initWithStyle:UITableViewStyleGrouped];
childController.title = @"Add President";
[self.navigationController pushViewController:childController animated:YES];
[childController release];

Ответы [ 2 ]

1 голос
/ 18 мая 2011

Добавьте указатель к PresidentAddController таким образом:

// in @interface
PresidentsViewController *listController;

@property (nonatomic, assign) PresidentsViewController *listController;

// in @implementation
@synthesize listController;

Затем, когда вы создаете экземпляр PresidentAddController, установите указатель:

PresidentAddController *childController = 
  [[PresidentAddController alloc]
   initWithStyle:UITableViewStyleGrouped];
childController.title = @"Add President";
childController.listController = self;
[self.navigationController pushViewController:childController animated:YES];
[childController release];

Итак, вы можете перейти [listController.list addObject:newPresident]; in PresidentAddController.

EDIT: childController.listController = self вызывает [childController setListController:self], что, в свою очередь, читает метод @synthesize d в вашей реализации и устанавливает указатель *listController вукажите текущий класс (если вы пишете код в классе PresidentsViewController, то self будет текущим экземпляром PresidentsViewController).

Причина, по которой я использую assignпотому что если вы используете retain, то когда вы установите listController в self, он фактически сохранит ссылку на объект-владельца.Это может вызвать всевозможные проблемы, если вы когда-нибудь попытаетесь освободить PresidentsViewController, потому что если у вас есть ссылка-владелец в PresidentAddController, она не будет освобождена до тех пор, пока эта ссылка также не будет освобождена.Использование assign гарантирует, что если вы когда-нибудь отпустите PresidentsViewController до того, как PresidentAddController исчезнет, ​​он будет должным образом освобожден.Конечно, может быть, вы захотите сохранить это в такой ситуации, и в этом случае использование retain здесь тоже хорошо.

0 голосов
/ 18 мая 2011

Я подозреваю, что у вас есть свойство, определенное как @property (nonatomic,copy) NSMutableArray *list; Получаете ли вы исключение и пытаетесь добавить объект в массив?Если это так, скорее всего, потому что модификатор copy возвращает неизменяемую копию массива.Попробуйте создать метод, который берет объект и добавляет его в список без использования self.list ... просто [list addObject], и если это работает, то это ваша проблема.

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