以编程方式使用UINavigationController设置RootViewController

Ada*_*dam 6 objective-c ios

我有一个带有导航控制器和默认RootViewController的程序.如果我没有以编程方式执行任何操作,应用程序将启动并且RootViewController按预期工作,例如下面的故事板表示:

在此输入图像描述

我遇到的问题是通过合并Optional Start ViewController.我想要的是:在我的AppDelegate(didFinishLaunchingWithOptions)中,我想要这样的代码:

UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"OptionalStartViewController"];
self.window.rootViewController = viewController;
[self.window makeKeyAndVisible];
Run Code Online (Sandbox Code Playgroud)

首先显示可选的Start ViewController.然后,在用户完成Optional可视控件后,他们可以显示RootViewController.

所以在Optional Start ViewController中,我添加了这样的代码来显示Root View Controller:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"RootViewController"];
[self appDelegate].window.rootViewController = viewController;
[[self appDelegate].window makeKeyAndVisible];
Run Code Online (Sandbox Code Playgroud)

这一切都有效,除了 RootViewController,如图所示,没有预期的导航控件(即视图显示没有导航控件).

我也尝试过以下代码(使用UINavigationController而不是ViewController),结果相同......

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
UINavigationController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"HomeViewController"];
[self appDelegate].window.rootViewController = viewController;
[[self appDelegate].window makeKeyAndVisible];
Run Code Online (Sandbox Code Playgroud)

另一个扭曲......可能有几个可选的启动视图控制器.

有任何想法吗?

Sai*_*aif 6

  1. 删除 UINavigationController
  2. 选择控制器(在我们的例子中为"可选的启动视图控制器")
  3. 点击 Editor >> Embed In >> Navigation Controller
  4. 现在选择Navigation Controller和右侧实用程序区域,选择选项Is Initial View Controller

如果要动态更改根视图控制器,则最好以编程方式进行,在中didFinishLaunchingWithOptions,获取窗口实例,使用根视图控制器初始化导航控制器,然后将Windows根视图控制器设置为导航控制器.这是代码.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.

    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

    OptionalFirstViewController *optionalFirstViewController = [[OptionalFirstViewController alloc] initWithNibName:@"OptionalFirstViewController" bundle:nil];
    UINavigationController *homeNavigationController = [[UINavigationController alloc] initWithRootViewController:optionalFirstViewController];
    [optionalFirstViewController release];
    self.window.rootViewController = homeNavigationController;
    [homeNavigationController release];
    [self.window makeKeyAndVisible];

    return YES;
}
Run Code Online (Sandbox Code Playgroud)

并确保取消选中Is Initial View Controller故事板中的所有视图控制器

希望这可以帮助