Путь навигации IOS ViewController - как выполнить навигацию назад - PullRequest
4 голосов
/ 02 января 2012

Я использую раскадровку IOS5.Путь к моему View Controller следующий:

tabbarVC --> navigationVC-1 --> tableVC-1 --(via segue push)-> tableVC-2 --(via segue modal)-> navigationVC-2 --> tableVC-3

В методе действия обратного вызова кнопки отмены в tableVC-3 я вызываю [self dismissViewControllerAnimated:YES completion:nil];, который успешно возвращает меня к tableVC-2.Однако, когда я пытаюсь изучить путь навигации назад в отладчике, я не вижу способа получить доступ к tableVC-2 из navigationVC-2.Я ожидал, что navigationVC-2 сохранит ссылку на tableVC-2 или navigationVC-1, но, похоже, это не так.Пожалуйста, смотрите мой вывод отладчика ниже.

Может кто-нибудь объяснить иерархию навигации и как программно пройти по цепочке назад?

(gdb) po self
<tableVC-3: 0x6d33340>

(gdb) po (UIViewController*) [self navigationController]
<UINavigationController: 0x6d33560>

(gdb) po (UIViewController*)[[self navigationController] navigationController]
Can't print the description of a NIL object.

(gdb) po (UIViewController*)[[self navigationController] topViewController]
<tableVC-3: 0x6d33340>

(gdb) po (UIViewController*)[[self navigationController] presentingViewController]
<UITabBarController: 0x6b2eba0>

(gdb) po (UIViewController*)[[self navigationController] presentedViewController]
Can't print the description of a NIL object.

(gdb) po (UIViewController*)[[self navigationController] visibleViewController]
<tableVC-3: 0x6d33340>

Ответы [ 4 ]

8 голосов
/ 13 сентября 2012

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

[self.navigationController popToRootViewControllerAnimated:TRUE];

Легко, когда вы натыкаетесь на правуюкоманда, не правда ли!

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

-(void)viewDidLoad
{
    [super viewDidLoad];

    // change the back button and add an event handler
    self.navigationItem.leftBarButtonItem =
    [[UIBarButtonItem alloc] initWithTitle:@"Back"
                                     style:UIBarButtonItemStyleBordered
                                    target:self
                                    action:@selector(handleBack:)];
}


-(void)handleBack:(id)sender
{
    NSLog(@"About to go back to the first screen..");
    [self.navigationController popToRootViewControllerAnimated:TRUE];
}
4 голосов
/ 31 июля 2013

После некоторого исследования с использованием этого и пары других вопросов для модальных UIViewControllers в раскадровке, чтобы вернуться к двум представлениям, которые я использовал

[self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil];
4 голосов
/ 02 января 2012

Будем бросать старый ответ, чтобы обновить его, чтобы он был более полным.
Для решения этого вопроса:

Может ли кто-нибудь объяснить иерархию навигации и как программно пройти цепочку назад?

Структура вашей навигации:

tabbarVC -> navigationVC-1 -> tableVC-1 - (посредством перехода по нажатию) -> tableVC-2 - (посредством перехода по модалу) -> навигацияVC-2 -> tableVC-3

Можно объяснить так:
TabbarVC показывает свой «selectedViewController» (navigationVC-1).
NavigationVC-1 имеет свой стек навигации, состоящий из TableVC-1 и TableVC-2 (topViewController of NavigagtionVC-1)
Затем NavigationVC-2 представляется Модально через tabbarVC, поэтому tabbarVC - это presentingViewController, а NavigationVC-2 - это presentedViewController

.

Таким образом, чтобы получить доступ к таблице VC-2 из таблицы VC-3, вам нужно сделать что-то вроде этого:

[(UINavigationController *)[(UITabBarController *)[tableVC-3 presentingViewController] selectedViewController] topViewController];

(не делайте этого в рабочем коде)

[tableVC-3 presentingViewController] и [tableVC-3.navigationController presentingViewController] вернут вам UITabBarController.


Если вы используете UINavigationController , вы должны использовать его push и pop для включения или выключения UIViewController в «стеке презентаций».
Вы сможете получить доступ к UINavigationController из этих UIViewController следующим образом:

self.navigationController

Если вы хотите вернуться более чем на один UIViewController в «стеке презентаций», вы можете использовать этот метод на UINavigationController

popToViewController: анимированные:
Выводит контроллеры представления, пока указанный контроллер представления не окажется на вершине стека навигации.
- (NSArray *) popToViewController: (UIViewController *) viewController animated: (BOOL) animated


Чтобы отклонить UIViewController , который был представлен модально, UIViewController, который представил его, нужно отклонить его с помощью:

- (void)dismissModalViewControllerAnimated:(BOOL)animated

Так что в этом случае должно быть:

[tableVC-2 dismissModalViewControllerAnimated:YES];
0 голосов
/ 10 июня 2016

Swift

Если вы используете контроллер навигации, вы можете вернуться к предыдущему контроллеру просмотра с помощью

self.navigationController?.popViewControllerAnimated(true)

или вернуться к контроллеру корневого просмотра с помощью

self.navigationController?.popToRootViewControllerAnimated(true)
...