从Login ViewController呈现以前活动的ViewController

时间:2015-04-21 09:17:58

标签: ios objective-c iphone login

我有4个视图控制器:loginVC - > homeVC - > aVC - >的 BVC

我们假设用户当前处于<​​strong> bVC 视图控制器,并决定切换到另一个应用程序。当用户切换回我的应用程序时,我想提供loginVC来验证用户身份。经过身份验证后,将向用户显示之前的 bVC 视图控制器,以继续他/她正在做的任何事情。我在项目中没有使用导航控制器。

applicationDidBecomeActive:方法中,我能够呈现loginVC视图控制器,但是一旦用户通过身份验证,我该怎么做才能显示 bVC 视图控制器?当应用程序从活动状态退出时,我认为 bVC 仍在堆栈中?

// AppDelegate.m
-(void) applicationDidBecomeActive: (UIApplication*) application {

    NSString *storyboardId = @"LoginIdentifier";
    self.window.rootViewController = [self.window.rootViewController.storyboard instantiateViewControllerWithIdentifier:storyboardId];  
}

// loginVC.m
-(void)authenticateSuccessful {
    // This doesn't do anything... as I want to present bVC
    [self dismissViewControllerAnimated:YES completion:nil];
}

3 个答案:

答案 0 :(得分:0)

1将您的LoginVC实例化并显示为模式

2在用户通过身份验证时将其关闭

//AppDelegate.m
- (UIViewController *)visibleViewController:(UIViewController *)rootViewController
{
    if (rootViewController.presentedViewController == nil)
    {
        return rootViewController;
    }
    if ([rootViewController.presentedViewController isKindOfClass:   [UINavigationController class]])
    {
        UINavigationController *navigationController =    (UINavigationController *)rootViewController.presentedViewController;
        UIViewController *lastViewController = [[navigationController viewControllers] lastObject];

        return [self visibleViewController:lastViewController];
    }
    if ([rootViewController.presentedViewController isKindOfClass:[UITabBarController class]])
    {
        UITabBarController *tabBarController = (UITabBarController *)rootViewController.presentedViewController;
        UIViewController *selectedViewController = tabBarController.selectedViewController;

        return [self visibleViewController:selectedViewController];
     }

     UIViewController *presentedViewController = (UIViewController *)rootViewController.presentedViewController;

     return [self visibleViewController:presentedViewController];
}

-(void) applicationDidBecomeActive: (UIApplication*) application {
    NSString *storyboardId = @"LoginIdentifier";
    UIViewController *lvc = [self.window.rootViewController.storyboard instantiateViewControllerWithIdentifier:storyboardId];
    // I.e show it modally instead of putting to rootViewController
    UIViewController *visibleVC = [self visibleViewController:self.window.rootViewController];
    [visibleVC presentViewController:lvc animated:NO completion:NULL];
}

// loginVC.m
-(void)authenticateSuccessful {
    [self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
}

答案 1 :(得分:0)

我相信当应用程序变为活动状态时,您需要做的是呈现(或模态)当前View控制器(在本例中为bVC)上的临时viewController。

当呈现视图控制器时,对象或您的bVC不会被破坏,因此一旦用户通过身份验证,您就可以解除 loginView。

[[NSNotificationCenter defaultCenter]addObserver:self
                                         selector:@selector(yourMethod)
                                             name:UIApplicationDidBecomeActiveNotification
                                           object:nil];

如果您需要从任何requiredView控制器提供LoginView

,添加这样的通知可能会有所帮助

请参阅PresentingView控制器上的documentation

答案 2 :(得分:0)

你可以通过将loginViewController作为模态来实现,如前所述,但我认为这个功能&#39;会让您的用户离开您的应用,因为他们希望在用户的生活中(首次使用您的应用时)完成一次登录部分。

如果您每次回到应用程序时确实需要用户登录您的应用程序(或服务器),我建议您选择在NSUserDefaults中存储用户的登录信息。

请记住,用户希望尽可能无缝地完成工作,他们真的不想在每次回到您的应用时输入他们的登录名/密码:)

相关问题