2015-01-23 4 views
0

У меня есть три UIViewControllers (назовем их A, B и C) в навигационном контроллере. A может переходить в B или C. B может переходить на C. Когда C закрывается, я хочу, чтобы он всегда возвращался к A, т.е. он автоматически закрывает B при закрытии C, если он открыт из B.Закрыть собственный uiviewcontroller после segue для дочернего uiviewcontroller ios?

Теперь, я попробовал используя SEGUE разматывать, так что, когда C закрывается, метод возвращения Б вызывается уволить контроллер назначения:

- (IBAction)returnFromC:(UIStoryboardSegue*)segue 
{ 
    [segue.destinationViewController dismissViewControllerAnimated:YES completion:nil]; 
} 

я поставил точку останова в этом методе - это называется. Я проверил, что destinationController действительно B. Однако я заметил, что когда точка останова попадает, C все еще видима. После игры из точки останова C завершает работу, как ожидалось, но B все еще отображается.

Любые идеи? Спасибо заранее.

ответ

3

Когда C закрывается, я хочу, чтобы всегда возвращаться к А, то он автоматически закрывается B при закрытии C, если открыт с B

Самое простое решение: в Кассиопеяне viewDidAppear:, тайно удалить B как ребенок навигационного контроллера. Другими словами, у вас есть это:

A > B > C 

Теперь вы переставить вещи так, что у вас есть это:

A > C 

Таким образом, единственное, что нужно вернуться к из С А.

Таким образом легко управлять набором детей навигационного контроллера. Просто позвоните setViewControllers:animated: (со вторым аргументом NO).

[Но если я правильно понял вашу установку, другим простым способом было бы реализовать метод размотки в A, а не B. Затем выполните размотку segue. Мы всегда разматывать на первый контроллер представления, который содержит разматывание метод, так что всегда будет А.]

+2

Способ на самом деле состоит в том, чтобы сделать изменчивую копию свойства 'viewControllers' контроллера навигации, удалить контроллер и затем назначить массив обратно контроллеру навигации. – mszaro

+0

Я использовал предложение положить метод разматывания в A. Я не понимал, что раскрутка работает над несколькими VC. Большое спасибо за быстрый быстрый ответ. – iht

+0

@iht Очень круто. Unwind чрезвычайно сложный и мощный и настраиваемый, а размещение метода разматывания - самая простая и самая основная часть этой конфигурации. Замечательно, что этой маленькой подсказки было достаточно, чтобы решить ее для вас! – matt

0

dismissViewControllerAnimated:completion: используются для отклонить режимных непосредственно перейти и имеет никакого эффекта для Пуша не перетекает

As @ Matt предложил вы можете просто удалить B (средний) вид контроллера от self.navigationController.viewControllers и вот пример кода, который вы можете поместить в вид B контроллера:

- (void)viewDidDisappear:(BOOL)animated { 
    [super viewDidDisappear:animated]; 

    // No need to process if the viewController is already being removed 
    if (!self.isMovingFromParentViewController) { 
     // Getting a mutable copy of the viewControllers (can't directly modify) 
     NSMutableArray *temp = [self.navigationController.viewControllers mutableCopy]; 

     // Removing 'self' -> so A > B > C will become A > C 
     [temp removeObject:self]; 

     // Setting the new array of viewControllers 
     self.navigationController.viewControllers = [temp copy]; // getting an immutable copy 
    } 
} 

PS Вы можете использовать popViewControllerAnimated: вместо Unwind segue, если вы не планируете отправлять данные обратно.