UINavigationController - 应用程序试图在目标上推送一个 nil 视图控制器,我错过了啥?

Posted

技术标签:

【中文标题】UINavigationController - 应用程序试图在目标上推送一个 nil 视图控制器,我错过了啥?【英文标题】:UINavigationController - Application tried to push a nil view controller on target, what am I missing?UINavigationController - 应用程序试图在目标上推送一个 nil 视图控制器,我错过了什么? 【发布时间】:2011-12-05 23:11:13 【问题描述】:

我的导航控制器无法正常运行!如果我在 RootViewController 处单击表格的单元格,它不会显示为下一个 ViewController。

错误信息读取

“应用程序试图在目标上推送一个 nil 视图控制器 。”

所以我分配了一些错误的东西,这是我的猜测,我可能错过了我所遵循的书中的一些重要内容。

所以问题出现在我的 RootViewController.m 中:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

    UINavigationController *navigationController= [[UINavigationController alloc]init];

    switch ([indexPath row]) 

        case 0:
            [navigationController pushViewController:kundeViewCon animated:YES];
            break;

        case 1:
            [navigationController pushViewController:kalenderViewCon animated:YES];
            break;

        case 2:
            [navigationController pushViewController:wunschViewCon animated:YES];
            break;
     

在我的 AppDelegate.m 中,我正在执行以下操作来将 RootViewController 设置为 NavigationController:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.

// Navigation Controller

    RootViewController *rootViewController = [[RootViewController alloc]init];

    navigationController = [[UINavigationController alloc]initWithRootViewController:rootViewController];

    self.window.backgroundColor = [UIColor whiteColor];

    [self.window addSubview:navigationController.view];
    [self.window makeKeyAndVisible];
    return YES;

所以当我单击单元格时,我得到了我想要推送的所有其他 ViewController。我就是看不到我的错或我错过了什么!?

也许有人可以帮助我并给我一个提示!那太好了!

【问题讨论】:

kundeViewCon、kalenderViewCon 和 wunschViewCon 是在哪里创建的? 这都是独立的类,它们是在 RootViewController.h 中创建的 我无法设置 (at),因为我用它命名用户,所以 (at) 是存在的!class KundeViewController;类 KalenderViewController;类 WunschViewController;接口 RootViewController : UITableViewController KundeViewController *kundeViewCon; KalenderViewController *kalenderViewCon; WunschViewController *wunschViewCon; 结束 【参考方案1】:

RootViewController 已经有了它的导航控制器 - 你在应用程序委托中创建了它。选择单元格时创建新的导航控制器没有意义。它应该看起来更像这样:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

    switch ([indexPath row]) 
        case 0:
            [self.navigationController pushViewController:kundeViewCon animated:YES];
            break;
        case 1:
            [self.navigationController pushViewController:kalenderViewCon animated:YES];
            break;
        case 2:
            [self.navigationController pushViewController:wunschViewCon animated:YES];
            break;
    

另外,请确保当您调用 -pushViewController:animated: 时,视图控制器(即 kundleViewConkalenderViewConwunschViewCon)不为零。它们看起来像实例变量或属性 - 只要确保您在代码中更早地分配/初始化它们,就像在 -viewDidLoad 中一样。

【讨论】:

非常感谢。我之前真的没有分配/初始化我的其他 ViewController。现在可以了!【参考方案2】:

您不必创建新的 UINavigationController。您需要从当前窗口中获取控制器。

[self.navigationController pushViewController:yourController animated:YES];

yourController 是您实例化的 UIViewController 之一(kundeViewCon、kalenderViewCon 或 wunschViewCon)

【讨论】:

谢谢,是的,它可以工作,我需要分配/初始化我的其他控制器。快乐!【参考方案3】:

对于 Google 员工:

如果您没有将 ViewController 连接到以下设备,也可能会发生这种情况:

"<Your Project> App Delegate"

如果你不这样做,那么你的控制器不会被初始化。

还需要将ViewController的类重命名为对应的.h/.m文件:

打开 xib 文件 -> 选择您的 ViewController -> 转到“Identity Inspector” -> 输入 文本字段“Class”对应的 .h/.m 文件的名称。

将您的 ViewController 连接到应用程序 通过右键单击并从 ...AppDelegate 拖动到您的 ViewController 释放后点击相应条目:

【讨论】:

以上是关于UINavigationController - 应用程序试图在目标上推送一个 nil 视图控制器,我错过了啥?的主要内容,如果未能解决你的问题,请参考以下文章

带有主 UINavigationController 和详细 UINavigationController 的 UISplitViewcontroller

带有 UINavigationController 的 UITabBarController,在 hidesBottomBarWhenPushed 上隐藏 UINavigationController

在 UINavigationController 内的 UITabBarcontroller 中添加 UINavigationController?

UINavigationController 与 AppDelegate 中的 UISegmentedControl 切换 UINavigationController 的 rootviewcontr

从一个 UINavigationController 到另一个 UINavigationController (Swift iOS 9, xcode 7)

UINavigationController