Проблема отклонения нескольких контроллеров модального представления - PullRequest
14 голосов
/ 19 марта 2010

У меня проблемы с отображением контроллеров модального представления. У меня есть родительский контроллер представления, который является делегатом для модального представления A . В модальном представлении A я представляю модальное представление B и имею модальное представление делегата dimiss A.

Когда появляется модальное представление B, оно, кажется, отображается, но экран тускнеет, и пользовательский интерфейс блокируется, но приложение не падает. Я установил для настроек анимации значение NO, но у меня все та же проблема.

Порядок событий:

  1. Parent View показать модальное представление A
  2. Модальное Представление A показывает Модальное Представление B в контроллере Модальное Представление A
  3. Родительский вид отклоняет модальное представление A в контроллере модального представления A через делегирование
  4. Здесь висит мой пользовательский интерфейс, я вижу модальное представление B, но не могу щелкнуть по нему или что-то сделать

Ответы [ 9 ]

19 голосов
/ 18 октября 2012

Вы можете использовать это

[[[self presentingViewController] presentingViewController]  dismissModalViewControllerAnimated:YES];
4 голосов
/ 22 марта 2010

Решено, если мой parentViewController действует как делегат. Вот мой заказ:

[parentView presentViewController:modalViewControllerA animated:YES]
[parentView dismissModalViewControllerAnimated:YES]
[parentView presentViewController:modalViewControllerB animated:YES]
//Modal B dismisses himself

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

4 голосов
/ 19 марта 2010

Модальный контроллер представления должен иметь родительский контроллер представления для отображения. Если вы отклоните родительский контроллер представления («модальное представление A» в вашем случае), поведение будет непредсказуемым.

Если вы уверены, что вложенные контроллеры модального представления - это то, что вам действительно нужно, вам нужно отклонить их в обратном порядке; подождите, пока вы не закончите с "B", затем отбросьте "B", затем отбросьте "A".

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

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

  1. [parentView presentViewController:modalViewControllerA animated:YES]
  2. [modalViewControllerA presentViewController:modalViewControllerB animated:YES]
  3. [modalViewControllerA dismissModalViewControllerAnimated:YES]
  4. [parentView dismissModalViewControllerAnimated:YES]
1 голос
/ 11 января 2016

в Swift 2.1

вы можете попробовать

self.presentingViewController?.presentingViewController?.dismissViewControllerAnimated(true, completion: nil)

работает у меня

Просмотр A -> Просмотр B -> Просмотр C

Применитьэтот код в представлении C, вы будете приземляться для просмотра A

1 голос
/ 07 октября 2015

Для iOS 6+ и - presentViewController:animated:completion:

[[[self presentingViewController] presentingViewController]  dismissViewControllerAnimated:YES completion:nil];
0 голосов
/ 17 февраля 2017

Apple, документ о отклонить (анимированный: завершение:) метод.

В разделе Discussion сказано:

any intermediate view controllers are simply removed from the stack.

Если вы представляете несколько контроллеров представления подряд, тем самым создавая стек представленных контроллеров представления, вызов этого метода для контроллера представления, расположенного ниже в стеке, отменяет его непосредственный дочерний контроллер представления и все контроллеры представления выше этого потомка в стеке. Когда это происходит, только самый верхний вид отклоняется в анимационном режиме; любые промежуточные контроллеры представления просто удаляются из стека. Самый верхний вид отклоняется, используя его модальный стиль перехода, который может отличаться от стилей, используемых другими контроллерами представления ниже в стеке.

Другими словами, если стек контроллера представления выглядит следующим образом

Root -> A -> B -> C -> D ... -> Z

D вызывает dismiss метод, все контроллеры представления, кроме D, например: (E ... Z), будут удалены из стека.

0 голосов
/ 25 августа 2011

Simple:

Отклонить все просмотры:

[self dismissModalViewController animated:YES];
[self dismissModalViewController animated:YES];
[self dismissModalViewController animated:YES];
[self dismissModalViewController animated:YES];

(по одному на каждое добавленное модальное представление)

затем представьте новый модальный контроллер вида

0 голосов
/ 27 сентября 2010

У меня есть основной вид, и мне нужно показать modalview1, где кнопка представляет modalview2. Выглядит так же, как вам нужно. Но в modalview2 есть кнопка, которая переходит к основному виду.

Итак, решение: Основное представление представляет UINavigationController с modalview1 в качестве rootController. Затем modalview1 представляет modalview2 с помощью «[self.navigationController modalview2 animated: YES];».

Когда modal2 необходимо перенаправить в главное представление, просто сделайте "[self.parentViewController dismissModalViewControllerAnimated: YES];" а UINavigationController скрыт.

Надеюсь, это понятно.

0 голосов
/ 17 сентября 2010

может быть после долгого, но .. У меня такая же проблема, и это единственный пост с некоторым ответом. Я не понимаю, что вы имеете в виду, что установка делегата parentViewController на self не разрешена.

то, что я сейчас делаю, это

[self presentModalViewController:ViewControllerA animated:YES];
[self dismissModalViewControllerAnimated:YES];// inside ViewControllerA
[self presentModalViewController:ViewControllerB animated:YES];
[self dismissModalViewControllerAnimated:YES];// inside ViewControllerB

Проблема в том, что после viewControllerA представление viewControllerB отсутствует.

Спасибо

...