pushViewController 不是根 viewController

Posted

技术标签:

【中文标题】pushViewController 不是根 viewController【英文标题】:pushViewController that's not a root viewController 【发布时间】:2016-05-16 19:58:42 【问题描述】:

我有两个视图控制器:LevelSelectViewController 和 GameViewController。

我正在制作的应用程序的根视图控制器都不是(根视图控制器称为 MainViewController)。

如何使用导航方法 pushViewController:animated: 来实现从 LevelSelectViewController 到 GameViewController 的转换?

在我的 LevelSelectViewController 中,您单击一个按钮,然后执行以下操作方法:

    - (IBAction)buttonPressed:(id)sender 
        // the pushViewController:animated: method hopefully can be used
        // other code
    

【问题讨论】:

你是如何显示LevelSelectViewController的? presentViewController...这就是我在我的应用程序中浏览所有按钮的方式。如果我将根视图控制器设置为 AppDelegate 中的导航控制器,是否可以将其他子视图控制器用作导航控制器? 【参考方案1】:

如何使用导航方法pushViewController:animated: 进行从LevelSelectViewController 到GameViewController 的转换?

术语“根视图控制器”可能有点令人困惑,因为UIWindow 有一个rootViewController 属性,而UINavigationController 有一个initWithRootViewController 参数。如果您正在调用-pushViewController:animated:,则您的视图控制器图中必须有一个导航控制器,因为该方法属于UINavigationController。如果您的 LevelSelectViewController 实例是导航堆栈的一部分,您可以这样做:

- (IBAction)buttonPressed:(id)sender 
    // create a game controller
    GameViewController *gameController = [[GameViewController alloc] initWithNibName:nil bundle:nil];

    // push it
    [self.navigationController pushViewController:gameController animated:YES];

    // other code

不过,现在更典型的做法是将所有视图控制器放在情节提要中,然后简单地将按钮连接到推送转换。

【讨论】:

我不知道如果您将根视图控制器设置为 App Delegate 中的导航控制器,该视图控制器的其他孩子也将能够享受相同的功能(无需重新定义其他导航控制器实例).....谢谢!【参考方案2】:

如果您使用情节提要,只需创建一个转场。如果你没有传递任何信息,你可以通过控制从一个视图控制器拖动到另一个来推送它。它是否是根视图控制器并不重要。

如果您想从视图控制器传递数据,请在情节提要上创建一个转场,而不是索引路径或按钮等,并在视图控制器中调用 prepareForSegueMethod,其标识符与情节提要上的转接完全相同。

【讨论】:

以上是关于pushViewController 不是根 viewController的主要内容,如果未能解决你的问题,请参考以下文章

表视图中的 PushViewController

UINavigationController pushViewController 不起作用

当推送一个新的控制器时,pushViewController 是不是应该释放 oldController?

PushViewController 显示黑屏

pushViewController 没有推送

Xcode 9 更新后 pushViewController 不起作用