为第一个UIViewController创建一个UINavigationController

问题描述:

看来有几种方法可以创建UINavigationController作为第一个控制器。也许最简单的方法是简单地点击Storyboard中的View Controller并将其嵌入到导航控制器中。但我想知道只有在代码中才能做到这一点的最佳方法。为第一个UIViewController创建一个UINavigationController

你也可以继承UINavigationController,导入第一个视图控制器,并在viewDidLoadallocinit一个实例,然后将其添加为childViewController。在故事板中,用导航控制器替换默认视图控制器,并将类设置为导航控制器。请注意,在以前的iOS版本中,不建议子类UINavigationController

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

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

在最新的开发环境中,针对iOS 8+的最合适的方法是什么?

+0

“最好”是一种主观的东西。你对什么具体情况感兴趣?你是在谈论使用没有故事板,或者有一个想要嵌入导航控制器的初始视图控制器的故事板? – rdelmar 2015-02-05 17:49:47

+0

为什么不在故事板中查看它在应用程序代理中为您生成的代码。然后你会看到它是如何完成的。第一个控制器是您在故事板中选择的属性检查器中的初始控制器。 – 2015-02-05 17:49:53

+0

@rdelmar尽可能地保持默认的故事板不变,在代码中执行所有的操作。如果它可以完全移除,那么在这种情况下最好。 – Joey 2015-02-05 18:15:00

如果您从故事板中的控制器开始,则只需在应用程序委托中添加两行即可将该控制器嵌入到导航控制器中。如果你想这样做的代码,我觉得这是最简单的方法,

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

如果你想这样做完全是在代码中,没有故事板,那么你需要创建窗口,导航控制器,和它的根视图控制器。您还需要点击文件列表中的项目图标,然后在“常规”标签中,从“主界面”下拉菜单中删除单词“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; 
}