在 UINavigationController 类中设置 rootViewController

Posted

技术标签:

【中文标题】在 UINavigationController 类中设置 rootViewController【英文标题】:Set rootViewController inside a class of UINavigationController 【发布时间】:2016-03-26 02:24:18 【问题描述】:

我的故事板中有一个 UINavigationController 和两个执行以下功能的 viewController:

InitialViewController:这将是应用程序的主屏幕。

FirstTimeViewController:是用户打开时出现的屏幕 首次使用该应用。

我的 UINavigationController 有一个包含以下代码的类:

- (void)viewDidLoad 
    [super viewDidLoad];

    if ([[ReadPlist initWithPlist:@"Configuration.plist" key:@"initialConfiguration"] boolValue])

        FirstTimeViewController *firstTimeController = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"firstTimeView"]; //or the homeController
        [self.navigationController pushViewController:firstTimeController animated:NO];

    else

    InitialViewController *initialController = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"initialView"]; //or the homeController
        [self.navigationController pushViewController:initialController animated:NO];

    


基本上这段代码验证 .plist 文件是否某个特定字段处于活动状态,如果是则表示应用程序是第一次运行,在这种情况下它会调用相应的 viewController。

但是这段代码不起作用,我看到一个带有黑色视图的 NavigationController。我要做的就是在界面构建器中做同样的事情,只需从 UIViewController 内的 UINavigationController 拖一条线并设置为“根视图控制器”,但在我的情况下,我正在尝试以编程方式执行此操作。

我该怎么做?

【问题讨论】:

在您当前的实现中,您是 pushViewController,这就是后退按钮可见的原因。更好的设置导航rootViewController 【参考方案1】:

当您在控制器 ViewDidload 或您的成功代码中推送到 FirstTimeViewController 设置 Bool(用户默认值)时。然后在您的 AppDelegate 下面的代码中设置。

如果(布尔值 = 是)

FirstTimeViewController *FS=[[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"FirstTimeViewController"]; UINavigationController *navController=[[UINavigationController alloc]initWithRootViewController:FS]; [navController setNavigationBarHidden:YES]; self.window.rootViewController=navController; self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible];

【讨论】:

【参考方案2】:

我的答案是

- (BOOL)application:(UIApplication *)app didFinishLaunchingWithOptions:(NSDictionary *)options

    UINavigationController *navController = (UINavigationController *)self.window.rootViewController;
    FirstTimeViewController *firstTimeVC = [navController.storyboard instantiateViewControllerWithIdentifier:@" FirstTimeViewController"];
    InitialViewController *initialVC = [navController.storyboard instantiateViewControllerWithIdentifier:@" InitialViewController"];
    if ([[ReadPlist initWithPlist:@"Configuration.plist" key:@"initialConfiguration"] boolValue])
    
       // FirstTime
       navController.viewControllers = [NSArray arrayWithObject:firstTimeVC];
    
    else
    
       // Initial
       navController.viewControllers = [NSArray arrayWithObject:initialVC];
    
    [self.window makeKeyAndVisible];
    return YES;

【讨论】:

以上是关于在 UINavigationController 类中设置 rootViewController的主要内容,如果未能解决你的问题,请参考以下文章

在 UINavigationController 内的 UITabBarcontroller 中添加 UINavigationController?

从嵌入在 UINavigationController 中的一个视图控制器到另一个 UINavigationController

(Swift) 在嵌套在 Main UINavigationController 中的 UINavigationController 和 UITabController 之间切换

关闭 UINavigationController 并呈现另一个 UINavigationController

带有主 UINavigationController 和详细 UINavigationController 的 UISplitViewcontroller

UINavigationController 标题和按钮