“试图弹出一个不存在的视图控制器。”

时间:2010-02-01 20:09:43

标签: iphone objective-c uiviewcontroller uinavigationcontroller

当我调用方法dismissView时,我收到此错误。这是方法存根:

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

这应该有效,我已经检查过,rootController被初始化并分配。有什么想法吗?

11 个答案:

答案 0 :(得分:26)

我最近遇到了这个问题并用这样的东西解决了......

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

答案 1 :(得分:12)

我使用pushViewController而不是popToViewController

解决了这个问题

答案 2 :(得分:11)

-popToViewController用于在堆栈中弹出视图控制器,直到已存在的控制器。你的UINavigationController有一堆ViewControllers(存储在viewControllers属性中),当你popToViewController时,你想要传递该数组中的一个元素作为第一个参数

在这种情况下,您最有可能要做的是使用-popViewControllerAnimated:,它会从堆栈中移除顶部ViewController

答案 3 :(得分:4)

你正在那里分配RootViewController。它在导航控制器的堆栈中不存在,因此无论您弹出多远,都无法触及它。

答案 4 :(得分:4)

如果您使用的是Storyboads,请使用此segue:

#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

答案 5 :(得分:1)

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

        }
    }
}

答案 6 :(得分:1)

快捷键4

对于仍在寻找不涉及 UINavigationController 堆栈索引的更好解决方案的人,使用更大的导航堆栈会遇到更多问题-这是解决此问题的最简单方法:

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

答案 7 :(得分:0)

使用Push Segues时,您可以使用此方法轻松返回根目录:

[self.navigationController popToRootViewControllerAnimated:YES];

使用模态分段时(由于问题中的忽略一词并作为一般参考),您可以使用此方法dismiss视图控制器:

[self dismissViewControllerAnimated:YES completion:nil];

答案 8 :(得分:0)

尝试这一行解决方案。

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

答案 9 :(得分:0)

在我的情况下,问题是我在根ViewController中,这仅适用于堆叠在其上的VC。 要弹出RootViewController,请使用

navigationController?.popToRootViewController(animated: true)

答案 10 :(得分:0)

const request = require("request");
const fs = require("fs");

const url = "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/FullMoon2010.jpg/1024px-FullMoon2010.jpg";
const fileStream = fs.createWriteStream("request-test.jpg");
const req = request(url);

req.on("response",  response => {
    response.pipe(fileStream);
});