2017-01-22 4 views
0

У меня есть firstViewController, что я показываю сВсе представленные контроллеры ракурса не уволенный

[self.navigationController pushViewController:firstViewController animated:true]; 

Затем, когда кнопка в первом ВК щелкнул, я представляю второй один:

[self presentViewController:secondViewController animated:true completion:nil]; 

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

[thirdVC modalPresentationStyle]; 
[thirdVC setModalPresentationStyle:UIModalPresentationOverCurrentContext];  
[self presentViewController:thirdVC animated:true completion:nil]; 

проблема в том, что я хочу кадрир заставьте firstVC, когда нажата кнопка подтверждения последнего VC. Поэтому я должен отклонить третий и второй. Я попробовал это в validateAction (в третьем ВК):

[[self parentViewController] dismissViewControllerAnimated:true completion:nil]; 
[self dismissViewControllerAnimated:true completion:nil]; 

Но результат в том, что thirdVC (модальный один) удален с поля, и из отладчика я могу видеть, что firstVC покрывается secondVC ,

Как я могу уволить второй и третий VC одновременно, чтобы вернуться к первому? ПРИМЕЧАНИЕ: Я хочу, чтобы подтолкнуть firstVC после того, как уволить из других, потому что я должен перезагрузить данные (в fristVC viewDidLoad)

+0

Можете ли вы попробовать позвонить '[self rejectViewControllerAnimated: true complete: nil]; [self rejectViewControllerAnimated: true complete: nil]; ' два раза один для увольнения третьего VC и второй для увольнения socondVC. –

ответ

0

От Apple's Documentation:

Контроллер вид Предъявление отвечает за отклонив контроллер представления, который он представил. Если вы вызываете этот метод на представленном контроллере представления, UIKit просит контроллер представления представления обрабатывать увольнение.

Другими словами, третий viewController просит второй viewController отклонить представленный viewController, который является третьим. Затем третий viewController пытается уволить себя, в результате чего UIKit попросит второй viewController снова отпустить третий.

Вам нужно перейти на один уровень и попросить первый viewController отклонить представленный контроллер представления.

Это хорошая практика, что третий viewController ничего не знает о иерархии представления. Вы можете использовать делегирование, чтобы сообщить первому viewController, что задача завершена. Выход segue - очень приятная альтернатива, если вы используете раскадровки.

Вам нужно только позвонить -dismissViewControllerAnimated:completion: один раз, если вы обращаетесь первый ViewController:

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

+0

, поэтому, если я понимаю, мне нужно позвонить [self rejectViewControllerAnimated: true complete: nil]; в validateAction третьегоViewController? –

+0

Это отклонит только третий монитор. Вызов rejectViewControllerAnimated: завершение: на secondViewController также будет отключен третий элемент управления. Вы должны вызвать его на первом экране управления, чтобы закрыть второй контроллер. – nils

Смежные вопросы