Передать переменную вверх по стеку навигации? - iPhone - PullRequest
0 голосов
/ 03 августа 2010

Я могу передать переменную вперёд от контроллера представления к контроллеру представления, помещая его контроллер представления в стек навигации. Пример того, как я это делаю, будет таким:

MyViewController *controller = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
controller.myString = stringToPass;
[self.navigationController pushViewController:controller animated:YES];
[controller release];

Однако что мне делать, если я хочу передать переменную BACK UP в стек навигации? Использование popViewControllerAnimated вместо pushViewController не передает переменную, как я думал.

Мне нужно иметь доступ к переменной, которая появляется в нескольких всплывающих окнах из контроллера представления, в котором она определена.

Любая помощь будет принята с благодарностью:)

Ответы [ 2 ]

0 голосов
/ 03 августа 2010

Вы передаете значения, а не переменные.

Контроллер вида не должен отвечать за появление. С контроллерами представления Apple (например, UIImagePicker) родительский контроллер представления обязан выполнять выталкивание; родительский VC также может получить текущее значение. (Не совсем правильно; он может получить доступ к значению до применения автозаполнения клавиатуры)

В качестве альтернативы, если это значение может использоваться глобально, его можно сохранить в делегате приложения.

0 голосов
/ 03 августа 2010

Вы можете получить навигационный контроллер в стеке VC, используя self.navigationController.Вы можете просто вызвать некоторый метод, такой как

[self.navigationController setMyString:stringToPassUp];

. Есть еще несколько способов, например, self.tabBarController для tabbarcontroller в стеке или, проще всего,

[self.parentViewController setMyString:stringToPassUp];

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

Если у вас есть какой-то объект (например, ваш MyViewController *controller)) и этому объекту есть, что сказать вам, обычный подход таков:

  • MyViewController получает свойство delegate типа (id)
  • контроллера представления, создающего экземпляр MyViewController, устанавливает это свойство делегата следующим образом:
    controller.delegate = self;
  • MyViewController, когда ему есть что сказать, делает что-то вроде:
    [self.delegate delegateMessage:arg1];, чтобы "передать сообщение", как выположить его.

Чтобы сделать это идеально, вы можете создать свой собственный @protocol MyViewControllerDelegate и объявить класс, который будет устанавливать controller.delegate = self; для принятия этого протокола, включив <MyViewControllerDelegate>линия @interface.Свойство delegate MyViewController затем должно быть объявлено id<MyViewControllerDelegate> delegate;, чтобы сообщения [self.delegate ...] можно было сопоставить со спецификацией протокола.

По сути, весь API-интерфейс Cocoa Touch работает следующим образом.Просто посмотрите на идеи, как реализовать ваше взаимодействие.

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