2012-09-05 2 views
1

Так что я ViewController А что представляет модальный ViewController B.dismissModalViewController из другого modalViewController

Тогда B представляет собой ViewController C.

То, что я пытаюсь сделать, это уволить ViewController B, так как я не нужно больше. Есть ли простой способ отклонить B и сохранить C на экране, как ребенок A, может быть?

+0

Не совсем. Если родительский контроллер представления недействителен, то есть его дети - вам нужно переделать концепцию UX вместо этого. –

+0

Хм, может быть. Но в любом случае это не конец света, если я буду держать этот viewController там какое-то время. –

+1

Вы можете получить ссылку на vc A из контроллера B (presentingViewController) и предоставить ему C и одновременно отпустить B. – rdelmar

ответ

2

Очевидно, как многие говорили, это в мире учебников было бы/должно быть ситуацией делегата. Где A представляет B и B представляет C. Затем, когда сделано C, он сообщает B, который отклоняет C, а затем B сообщает A об увольнении B.

Я бы сказал, что вы по существу создаете набор модально представленных контроллеров представлений, которые составляют стек навигации. Я бы, скорее всего, реализовал его как таковой. Где A будет контроллером корневого представления. A затем надавите на стек B, и B будет толкать C в стек. Когда было выполнено C, это могло бы быть просто popToRootViewControllerAnimated: или popToViewController:A animated:YES, если A не был rootViewController.

также удаляет B из-под C выглядит проблематичным.Но это не похоже, что высечено в камне на основе вашего комментария:

Но в любом случае его не конец света, если я держу, что ViewController там на некоторое время. -

Это позволит хотя бы включить достаточно чистую настройку делегата.

По-прежнему кажется, что вы в основном знаете, что, когда пользователь закончил работу с C, им больше не понадобится B. Если это так, вы можете вслепую увольнять сразу два или более диспетчеров. И код для двоих одновременно довольно прост. (при условии, что версия iOS> 5.0)

[self.presentingViewController.presentingViewController dismissModalViewControllerAnimated:YES]; 

Обратите внимание, что я сказал слепо! Этот код не прощает и делает предположения. Например, наиболее очевидно, что контроллер вида имеет на самом деле presentingViewController и что этот контроллер представления имеет номер presentingViewController. Если любой из этих критериев не будет выполнен, этот код сделает ничего. Это может легко произойти, если вы в любой момент перестроете свое приложение.

Итак, если вы решите использовать эту строку кода, используйте ее очень осторожно. И, пожалуйста, рассмотрите возможность использования UINavigationController для этой иерархии представлений или, по крайней мере, для делегирования.

+0

Я попробовал добавить их в качестве параметра navigationControl, но у меня были проблемы со скрытием/показом моего tabBar, поэтому я вернулся с модальным решением. Я буду придерживаться '[self.presentingViewController.presentingViewController rejectModalViewControllerAnimated: YES];' solution. –

+0

@ AndréCytryn Достаточно честный. Иногда такой код является лучшим выбором. Подсказка для использования 'UINavigationController' вы можете представить' UINavigationController', так что весь 'UINavigationController' охватывает' tabBar'. В любом случае, рад помочь. – NJones

1

Вы могли бы сделать эту работу:

  • предоставлять недвижимость на B, как "dieOnDismiss"

  • реализовать 'dismissViewControllerAnimated: ДА' в B, и переслать сообщение супер

  • С необязательно устанавливает, что свойство

  • , когда С посылает B «dismissViewControllerAn imated:», B посылает уволить супер, немедленно посылает„dismissViewControllerAnimated: NO“

Не уверен, если вы можете использовать анимированные на одном переходе и он выглядит правильно - вы можете быть в состоянии. Но если нет, вы можете просто вернуться к A без анимации.

0

У вас может быть экземпляр общего доступа, который содержит слабый указатель на ваш контроллер корневого представления (так A здесь). Используйте этот экземпляр акций представить/отклонить C всякий раз, когда вы хотите от А с помощью этого указателя А.

EDIT

Это следить за ответ от TimD. В любом случае в предложенном подходе C и B оба будут представлены из A.

1

Вы можете попробовать, чтобы A соответствовал протоколу, который определяет, как C представлен, а затем B, чтобы вызвать презентацию C , вместо того, чтобы B отвечал за представление самой C. Если C может существовать независимо от B, то A эффективно действует как «родитель» для обоих.

Смежные вопросы