"Пытался выскочить на контроллер просмотра, которого не существует".

Я получаю эту ошибку, когда вызываю свой метод rejectView. Ниже приведен метод заглушки:

-(IBAction)dismissView
{
    RootViewController *rootController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil];
    [self.navigationController popToViewController:rootController animated:YES];
}

Это должно работать, и я проверил, rootController инициализируется и распределяется. Любые идеи?

Ответ 1

У меня была эта проблема в последнее время и решалась с чем-то вроде этого...

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];

Ответ 2

Я решил это, используя pushViewController, а не popToViewController

Ответ 3

-popToViewController используется для того, чтобы контроллеры pop view отключили стек, вплоть до уже существующего. Ваш UINavigationController имеет стек ViewControllers (хранится в свойстве viewControllers), когда вы popToViewController, вам нужно передать один из элементов в этом массиве в качестве первого аргумента.

В этом случае вы, скорее всего, захотите использовать -popViewControllerAnimated:, который удалит верхний ViewController из стека

Ответ 4

Вы размещаете RootViewController прямо там. Он не существует в стеке контроллера навигации, поэтому, независимо от того, насколько далеко вы поп, вы не достигнете его.

Ответ 5

Если вы используете Storyboads, используйте этот сеанс:

#import "PopToControllerSegue.h"

@implementation PopToControllerSegue

- (void) perform
{
    UIViewController *sourceViewController = (UIViewController *)self.sourceViewController;
    UIViewController *destinationViewController = (UIViewController *)self.destinationViewController;

    for (UIViewController* controller in sourceViewController.navigationController.viewControllers) {
        if ([controller isKindOfClass:destinationViewController.class]) {
            [sourceViewController.navigationController popToViewController:controller animated:YES];
            return;
        }
    }

    NSLog(@"PopToControllerSegue has failed!");
}

@end

Ответ 6

Swift 4

Для тех, кто все еще ищет лучшее решение, не включающее индексы стека UINavigationController, которое становится все более проблематичным с большим стеком навигации - вот самый простой способ решить это:

if let destinationViewController = navigationController?.viewControllers
                                                        .filter(
                                      {$0.classForCoder == DestinationViewController.self})
                                                        .first {
    navigationController?.popToViewController(destinationViewController, animated: true)
}

Ответ 7

UINavigationController имеет стек ViewControllers, который хранится в свойстве viewControllers (NSArray). Перечислите требуемый ViewController и нажмите на ViewController.

Следующий код должен решить проблему.

-(IBAction)dismissView
{
    NSArray *array = self.navigationController.viewControllers;
    for (id controller in array) {
        if ([controller isKindOfClass:[RootViewController class]]) {
            [self.navigationController popToViewController:controller animated:YES];

        }
    }
}

Ответ 8

При использовании Push Segues вы можете легко вернуться к корню, используя этот метод:

[self.navigationController popToRootViewControllerAnimated:YES];

При использовании Modal Segues (из-за слова отклонить в вопросе и в качестве общей ссылки) вы можете dismiss использовать контроллер вида с помощью этого метода:

[self dismissViewControllerAnimated:YES completion:nil];

Ответ 9

Попробуйте это однострочное решение.

Свифт 4+:

self.navigationController?.popToViewController ((self.navigationController?.viewControllers[1]) as! Your_ViewController, animated: true)

Objective-C:

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];

Ответ 10

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

navigationController?.popToRootViewController(animated: true)

Ответ 11

self.navigationController?.present(viewControllers, animated: true, completion: nil)