ios - 以编程方式使用 UINavigationController 设置 RootViewController

标签 ios objective-c

我有一个带有导航 Controller 和默认 RootViewController 的程序。如果我不以编程方式执行任何操作,应用程序将启动并且 RootViewController 会按我的预期工作,例如下面的 Storyboard表示的内容:

enter image description here

我遇到的问题是合并可选的启动 ViewController。我想要的是:在我的 AppDelegate (didFinishLaunchingWithOptions) 中,我想要这样的代码:

UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"OptionalStartViewController"];
self.window.rootViewController = viewController;
[self.window makeKeyAndVisible];

首先显示可选的 Start ViewController。然后,在用户完成 Optional viewcontroller 之后,他们可以显示 RootViewController。

所以在可选的启动 View Controller 中,我添加了这样的代码来显示 Root View Controller :

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
UIViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"RootViewController"];
[self appDelegate].window.rootViewController = viewController;
[[self appDelegate].window makeKeyAndVisible];

这一切都有效,除了 RootViewController 在显示时没有预期的导航控件(即显示的 View 没有导航控件)。

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

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
UINavigationController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"HomeViewController"];
[self appDelegate].window.rootViewController = viewController;
[[self appDelegate].window makeKeyAndVisible];

另一个转折...可能有几个可选的开始 View Controller 。

有什么想法吗?

最佳答案

  1. 删除UINavigationController
  2. 选择 Controller (在我们的例子中是“可选的启动 View Controller ”)
  3. 点击 Editor >> Embed In >> Navigation Controller
  4. 现在选择 Navigation Controller 和 Right Side Utility 区域,选择选项 Is Initial View Controller

如果您想动态更改 Root View Controller ,那么最好以编程方式进行,在 didFinishLaunchingWithOptions 中,获取窗口实例,使用 Root View Controller 初始化导航 Controller ,然后设置窗口 Root View Controller 到导航 Controller 。 这是代码。

- (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;
}

并确保取消选中 Storyboard中所有 View Controller 的 Is Initial View Controller

希望对你有帮助

关于ios - 以编程方式使用 UINavigationController 设置 RootViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28457732/

相关文章:

ios - UITransitionContextFromViewControllerKey 返回错误的 ViewController

iphone - ios中的ASCII解码

ios - 在没有突变的情况下得到 "NSOrderedSetArrayProxy was mutated while being enumerated"错误

iphone - iOS,Facebook注销并清除用户 token

ios - NSOperation + NSURLConnection

iphone - 在 iOS 6 上更改 TextView 的默认内容的正确方法是什么?

ios - 运行 ntimer 来显示广告,但仅显示在某些 View Controller 上

ios - Xcode 8.1 显示 'try signing in again or contact apple support to resolve account access issue' 我该怎么办?

iphone - AFNetworking 在 NSError 对象中返回响应

iPhone:Objective-C 中的静态方法与 sharedManager