Проблема с увольнением нескольких контроллеров модального представления

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

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

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

  • Показать родительский просмотр Модальный просмотр A
  • Модальный вид A показывает Modal View B в режиме Modal View Контроллер
  • Parent View отклоняет Modal View A в Modal View Контроллер через делегирование
  • Здесь мой пользовательский интерфейс зависает, я вижу Modal View B, но не могу нажать на него или сделать что-либо

Ответы

Ответ 1

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

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

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

Ответ 2

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

[[[self presentingViewController] presentingViewController]  dismissModalViewControllerAnimated:YES];

Ответ 3

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

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

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

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

  • [parentView presentViewController:modalViewControllerA animated:YES]
  • [modalViewControllerA presentViewController:modalViewControllerB animated:YES]
  • [modalViewControllerA dismissModalViewControllerAnimated:YES]
  • [parentView dismissModalViewControllerAnimated:YES]

Ответ 4

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

[[[self presentingViewController] presentingViewController]  dismissViewControllerAnimated:YES completion:nil];

Ответ 5

в Swift 2.1

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

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

работает для меня

Просмотр A → Просмотр B → Просмотр C

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

Ответ 6

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

то, что я делаю прямо сейчас,

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

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

Спасибо,

Ответ 7

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

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

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

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

Ответ 8

Простой:

Отклонить все виды:

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

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

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

Ответ 9

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

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

any intermediate view controllers are simply removed from the stack.

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

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

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

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