Как отменить 2 Modal View Controllers в последовательности?

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

A presents B which presents C. 

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

Отклонить C:

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

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

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

 [self.parentViewController dismissModalViewControllerAnimated:YES]; 

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

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

 [self.parentViewController dismissViewControllerAnimated:YES completion:^{ /* do something when the animation is completed */ }]; 

Просто выяснилось, что вам нужно использовать presentingViewController в iOS 5.

 [self.presentingViewController.presentingViewController dismissModalViewControllerAnimated:YES]; 

A -> B -> C

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

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

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

Объяснение:

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

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

В Б. Путь:

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

Выполняйте только одну анимацию.

Проверьте это быстро:

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

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

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

  [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, и все выглядит намного лучше!

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

 // Swift presentingViewController?.dismissViewControllerAnimated(true, completion: nil) // Objective-C [self.presentingViewController dismissViewControllerAnimated:true completion:nil]; 

В быстрых 4

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

Контроллер навигации имеет свойство viewControllers, которое представляет собой массив – вы можете установить его на новый массив за вычетом двух controllerов представления, которые вы хотите удалить.

Вдохновленный решением Albertos, я создал метод делегата в B с блоком, чтобы показать результат удаления учетной записи:

 #pragma - mark - AddAccountViewControllerDelegate Methods - (void) dismissToSettings { [self dismissModalViewControllerAnimated:NO]; [self dismissViewControllerAnimated:YES completion:^(void){[DKMessage showMessage:LS(@"Account was successfully created")];}]; } 

Я столкнулся с той же проблемой, и лучшим решением было создание «DismissViewProtocol» следующим образом:

Файл: DismissViewProtocol.h

 @protocol DismissViewProtocol  -(void)dismissView:(id)sender; @end 

В моем B-модальном представлении давайте ответ для метода делегата:

в моем файле bh:

 #import "DismissViewProtocol.h" @interface B-Modal : UIViewController  ... @end 

в моем bm-файле:

 -(void) dismissView:(id)sender { [((UIViewController *) sender) dismissModalViewControllerAnimated:NO]; [self dismissModalViewControllerAnimated:YES]; } 

В том же controllerе B-view, когда я вызываю Next, в моем модальном режиме B, когда я вызываю другое модальное представление C, предположим, что для segue:

 -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { ((C-ViewController *)segue.destinationViewController).viewDelegate=self; } 

Наконец, в моем файле ch, давайте подготовиться к делегату:

 @property(nonatomic, weak) id  viewDelegate; 

И в моем файле cm, я просто скажу, что мой viewDelegate отклонил мой modal view controller и сам:

 -(void)closeBothViewControls { [self.viewDelegate dismissView:self]; } 

Вот и все.

Надеюсь, это сработает для всех вас.

Вот как можно уволить больше одного модального controllerа, используя цикл повтора:

Swift 3

 // In this example code will go throw all presenting view controllers and // when finds it then dismisses all modals. var splitViewController: UIViewController? = self repeat { splitViewController = splitViewController?.presentingViewController } while (!(splitViewController is UISplitViewController) && (splitViewController != nil)) splitViewController?.dismiss(animated: true, completion: nil) 
  • как увеличить размер шрифта в UIWebView
  • канонический способ рандомизации NSArray в Objective C
  • Включить немодульный заголовок внутри фрейм-модуля
  • Как я могу получить точное время, например, в миллисекундах в Objective-C?
  • Скрытые особенности Xcode
  • В чем разница между «отображаемым именем пакета» и «именем пакета» в информационном plist приложения cocoa
  • Одновременные распознаватели жестов в Iphone SDK
  • Выполнение команды терминала из приложения Cocoa
  • Преобразование NSArray в NSDictionary
  • Округлые углы только на вершине UIView
  • Как Apple знает, что вы используете частный API?
  • Давайте будем гением компьютера.