Как отказаться от двух модальных контроллеров подряд? - PullRequest
38 голосов
/ 11 июля 2010

У меня есть 2 контроллера вида, представленные модально.

A presents B which presents C.

Когда я увольняю C, я бы тоже хотел уволить B. Но я не уверен, как это сделать:

Уволить C:

[self dismissModalViewControllerAnimated:YES]
//[delegate dismissB] //this doesn't work either when i create a delegate pattern

Теперь я остаюсь с B. Как я могу уволить B из C?

Ответы [ 15 ]

109 голосов
/ 01 ноября 2011

Только что выяснилось, что вам нужно использовать представляющий ViewController в iOS 5.

[self.presentingViewController.presentingViewController dismissModalViewControllerAnimated:YES];

A -> B -> C

Запуск приведенного выше кода в модальном C вернет вас к A

14 голосов
/ 15 сентября 2016

Это сработало для меня, очень просто

// Call inside View controller C    
self.presentingViewController?.dismissViewControllerAnimated(false, completion: nil)
self.presentingViewController?.dismissViewControllerAnimated(true, completion: nil)

Объяснение:

Если вы вызываете dismiss на C, он может удалить только C. Если вы вызываете dismiss на B, он сделаетправильная вещь: Снимите верхний модальный контроллер вида.Поэтому первый вызов удаляет C (без анимации).Второй вызов удаляет B.

Самый простой способ получить доступ к контроллеру представления B из C - это использовать переменную presentingViewController.

12 голосов
/ 05 апреля 2011

В B. Положите:

[self dismissModalViewControllerAnimated:NO];
[self dismissModalViewControllerAnimated:YES];

Запустите только одну анимацию.

9 голосов
/ 12 июля 2010

Попробуйте использовать следующий код в B (сразу после закрытия C, как вы уже делаете):

[self.parentViewController dismissModalViewControllerAnimated:YES];

ВАЖНО :
Не делайте ничего в методе после этой строки.
Этот контроллер вида (B), вероятно, будет освобожден и освобожден ...

UPDATE
Начиная с iOS7, описанный выше метод устарел.
Вместо этого используйте следующий метод:

[self.parentViewController dismissViewControllerAnimated:YES completion:^{ /* do something when the animation is completed */ }];
6 голосов
/ 28 июля 2016

Проверьте это для быстрого:

self.presentingViewController?.presentingViewController?.dismissViewControllerAnimated(true, completion: nil);
4 голосов
/ 30 марта 2018

Быстро 4

self.presentingViewController?.presentingViewController?.dismiss(animated: true, completion: nil);

2 голосов
/ 17 августа 2016

Я прочитал все темы и не нашел правильного ответа.Если вы отклоните B, то C немедленно исчезнет и создаст странный эффект.Правильный способ представить C как дочерний контроллер представления с настраиваемой анимацией снизу, например:

   [b addChildViewController:c];
    c.view.frame = CGRectOffset(b.view.bounds, 0, b.view.bounds.size.height);
    [b.view addSubview:c.view];
    [c didMoveToParentViewController:b];

    [UIView animateWithDuration:0.5 animations:^{
        c.view.frame = CGRectOffset(c.view.frame, 0, -b.view.bounds.size.height);
    } completion:^(BOOL finished) {

    }];

А затем вы просто отклоняете B, и все выглядит намного лучше!

2 голосов
/ 14 мая 2016

Это сработало для меня:

// Swift
presentingViewController?.dismissViewControllerAnimated(true, completion: nil)

// Objective-C
[self.presentingViewController dismissViewControllerAnimated:true completion:nil];
2 голосов
/ 05 апреля 2011

Вам нужна только одна команда отклонения.Просто отклоните B, и тогда C уйдет с этим.

0 голосов
/ 02 июля 2019

Я нашел решение.

Вы можете поместить эти ViewControllers в отдельного человека NavigationController.И чем отклонить NavigationController приведет к одновременному отклонению всех этих ViewControllers.

https://gist.github.com/ufo22940268/2949fdf59c9860292f263ebb1e8036d7

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