为第一个 UIViewController 创建一个 UINavigationController

Creating a UINavigationController for the first UIViewController

似乎有几种方法可以创建 UINavigationController 作为第一个控制器。也许最简单的方法是简单地单击 Storyboard 中的 View Controller 并将其嵌入到导航控制器中。但我想知道仅在代码中执行此操作时的最佳方法。

你可以子class UINavigationController,导入第一个视图控制器,并在viewDidLoad allocinit中添加一个实例,然后将其添加为一个childViewController。在情节提要中,将默认视图控制器替换为导航控制器,并将 class 设置为您的导航控制器。请注意,在以前的 iOS 版本中,不建议使用 subclass UINavigationController.

或者你可以创建另一个UIViewControlleralloc init第一个视图控制器,然后alloc init一个UINavigationController以那个视图控制器为根,添加导航控制器作为此视图控制器的子视图控制器,并将导航控制器的视图添加为此视图控制器的视图的子视图。更改 Storyboard 中视图控制器的 class。不过,这是一个尴尬的设置,因为您创建了一个视图控制器,其目的是添加一个导航控制器,但它本身并不是一个导航控制器。

我读过另一种方法,它涉及在 AppDelegate 中创建 UINavigationController。也许还有更多解决方案。

什么是最合适的方法,在最新的开发环境中工作,目标是 iOS 8+?

如果您从情节提要中的控制器开始,则只需在应用程序委托中添加两行即可将该控制器嵌入导航控制器中。如果你想用代码来做,我认为这是最简单的方法,

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:self.window.rootViewController];
    self.window.rootViewController = nav;
    return YES;
}

如果您想完全在代码中完成,没有故事板,那么您需要创建 window、导航控制器及其根视图控制器。您还需要单击文件列表中的项目图标,然后在 "General" 选项卡中,从 "Main Interface" 下拉列表中删除单词 "main"(该条目告诉系统以一个名为 "main.storyboard").

的故事板
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    ViewController *vc = [ViewController new]; // You need to create this controller's view in its loadView method
    vc.title = @"Root View Controller";
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];
    [self.window setRootViewController:nav];
    [self.window makeKeyAndVisible];
    return YES;
}