'Попытался открыть контроллер представления, который не существует.' - PullRequest
13 голосов
/ 01 февраля 2010

Я получаю эту ошибку при вызове моего метода dismissView. Вот метод заглушки:

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

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

Ответы [ 9 ]

26 голосов
/ 16 ноября 2012

Недавно я столкнулся с этой проблемой и решил что-то вроде этого ...

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];
12 голосов
/ 17 октября 2012

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

11 голосов
/ 01 февраля 2010

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

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

4 голосов
/ 17 июля 2013

Если вы используете 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
4 голосов
/ 01 февраля 2010

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

1 голос
/ 24 апреля 2019

Swift 4

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

if let destinationViewController = navigationController?.viewControllers
                                                        .filter(
                                      {$0.classForCoder == DestinationViewController.self})
                                                        .first {
    navigationController?.popToViewController(destinationViewController, animated: true)
}
1 голос
/ 03 февраля 2016

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];

        }
    }
}
0 голосов
/ 25 февраля 2019

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

Swift 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];
0 голосов
/ 08 марта 2014

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

[self.navigationController popToRootViewControllerAnimated:YES];

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

[self dismissViewControllerAnimated:YES completion:nil];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...