Проблема с увольнением нескольких контроллеров модального представления
У меня возникли проблемы с отображением моих контроллеров модального представления. я имеет родительский контроллер представления, который является делегатом для модального вида 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)
, будут удалены из стека.