【问题标题】:Instantiate view controller from within navigation stack on launch启动时从导航堆栈中实例化视图控制器
【发布时间】:2014-07-08 04:11:18
【问题描述】:

我有一个这样的应用

导航控制器 -> 登录控制器 -> 主视图控制器 -> 其他东西

我想尝试在 applicationdidfinishloadingwithoptions 中登录,如果成功则加载主视图控制器,否则加载登录视图控制器。我的问题是无论如何我都希望导航堆栈像上面一样保持不变,这样如果我想注销,我可以弹回我的登录视图控制器。

现在我尝试在成功登录时实例化一个主视图控制器,但在注销和其他导航时它抱怨我没有嵌入导航控制器。

这样做的正确方法是什么?

【问题讨论】:

    标签: ios uinavigationcontroller segue appdelegate xcode-storyboard


    【解决方案1】:

    如果您使用故事板,那么首先为登录创建一个UIViewController 并为其提供故事板 ID,然后创建您的 mainViewController 并将其嵌入UINavigationController 并将故事板 ID 提供给UINavigationController

    之后,在 AppDelegate.m 的 applicationdidfinishloadingwithoptions 中,根据用户是否已登录,加载相应的 VC。

    示例

    // Check if user is logged in
    if ([[NSUserDefaults standardUserDefaults] stringForKey:@"loggedIn"] == NULL || [[[NSUserDefaults standardUserDefaults] stringForKey:@"loggedIn"] isEqualToString:@"false"]) {
            // show login page
            UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    
            UIViewController *mainViewController = [storyboard instantiateViewControllerWithIdentifier:@"login"];
    
            self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
            self.window.rootViewController = mainViewController;
            [self.window makeKeyAndVisible];
    } else {
    
            // show home page
            UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
            UIViewController *mainViewController = [storyboard instantiateViewControllerWithIdentifier:@"home"];
    
            self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
            self.window.rootViewController = mainViewController;
            [self.window makeKeyAndVisible];
    }
    

    编辑

    所以你的堆栈会变成这样

    NavController->mainVC->OtherStuff
    

    和独立的

    LoginVC
    

    【讨论】:

    • 你能帮我想象一下吗?我是从你的回答中想到的(Nav->login->main(w/nav embedded)->other)然后给我的登录名和嵌入的导航控制器一个 id?
    • @user3667450 我认为代码示例足以理解或者您需要图像吗?。
    • 啊!不需要图像,但是谢谢,当我发表评论时,代码示例尚未加载。谢谢!我现在就试试这个
    • 我对故事板 ID 所指的控制器感到困惑,我不需要将导航控制器实例化为 root 以便导航吗?沿着这些思路,我如何在 login 和 main 之间来回切换?
    • @user3667450 home id 在 UINavController 上,login 在 UIViewController 上。是的,当您显示主 VC 时,导航控制器应该是 root,而不是当您显示登录 VC 时。要打开 VC,您需要将其作为模型 segue 打开。
    【解决方案2】:

    Yogesh 的回答对我来说效果很好,但是我找到了一种更优雅的方式来执行我所需要的。在 applicationdidfinishlaunchingwithoptions 中,我执行了一个登录测试。如果我登录了(测试成功),我会像这样将我的主视图控制器的一个实例推送到堆栈上。

    if(loggedIn) {
        UIViewController *main = [self.window.rootViewController.storyboard instantiateViewControllerWithIdentifier:@"Main"];
        [(UINavigationController *)self.window.rootViewController pushViewController:main animated:NO];
    

    【讨论】:

      【解决方案3】:

      导航控制器 -> 登录控制器 -> 主视图控制器 -> 其他东西

      更改您的导航堆栈,

      导航控制器 -> 主视图控制器 -> 其他东西

      所以主视图控制器是导航栈的RootViewController。

      如果(用户登录状态 == 是) {

      做其他事情,根据流程显示其他屏幕。

      } 别的 {

      从主视图控制器推送或呈现“loginviewcontroller”, 所以成功登录后只需弹出'loginviewcontroller'

      }

      【讨论】:

        猜你喜欢
        • 2012-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-17
        • 1970-01-01
        • 2015-04-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多