在启动时从导航堆栈中实例化视图控制器

时间:2014-07-08 04:11:18

标签: ios uinavigationcontroller segue appdelegate xcode-storyboard

我有这样的应用

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

我想尝试登录applicationdidfinishloadingwithoptions,如果成功则加载主视图控制器,否则加载登录视图控制器。我的问题是我希望导航堆栈无论如何都保持完整,这样如果我想退出,我就可以弹回我的登录视图控制器。

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

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

3 个答案:

答案 0 :(得分:1)

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

之后在AppDelegate.m的UINavigationController加载基于用户的相应VC已登录或不登录。

实施例

applicationdidfinishloadingwithoptions

修改

所以你的堆栈会变成这样的

// 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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

更改导航堆栈,

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

因此主视图控制器是导航堆栈的RootViewController。

if(userloginstatus == YES) {

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

} 其他 {

从主视图控制器推送或显示“loginviewcontroller”,   因此,在成功登录后,只需弹出“loginviewcontroller”

即可

}