我应该如何重置我的根视图控制器以进行注销

时间:2017-02-02 17:15:24

标签: ios objective-c uinavigationcontroller

我的应用程序以我的登录屏幕作为初始VC进行实例化。当用户成功登录时,我实例化导航控制器并将homeVC设置为根视图控制器。一旦登录,用户可以从应用中的任何页面访问他们的“我的个人资料”信息,以及退出。

将“返回”转换为登录视图控制器的最佳方法是什么?我想确保从内存中删除任何VC,但由于登录VC存在于导航控制器之外,我不能简单地跳回到根视图控制器。

感谢任何指导。

1 个答案:

答案 0 :(得分:3)

简短回答,如果您通过设置窗口的根目录从登录界面到应用程序的主用户界面,那么这是一个很好的方式来取回

// in some view controller in your app when you need to change to the login UI
UIStoryboard *storyboard = [self storyboard];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"MyLoginVCIdentifier"];
UIWindow *window = [UIApplication sharedApplication].delegate.window;
window.rootViewController = vc;

更长的答案,我有时会使用一个视图控制器,其唯一的工作就是管理它,并将其称为LaunchViewController

在我的main.storyboard中,我创建了LaunchViewController的实例并设置了#34;是初始视图控制器"为真。

这个VC不需要UI,因为它唯一的工作就是在它出现时立即替换它。但是,由于我甚至不想在LaunchScreen.storyboard之后使用瞬间闪存,因此我有时会使用启动故事板视图覆盖此vc的视图,但此部分是可选的....

// LaunchViewController.m
- (void)viewDidLoad {
    [super viewDidLoad];

    UIStoryboard *storyboard = [self.class storyboardWithKey:@"UILaunchStoryboardName"];
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"LaunchVC"];
    [self.view addSubview:vc.view];
}

// a convenience method to get a storyboard from the bundle by key
+ (UIStoryboard *)storyboardWithKey:(NSString *)key {
    NSBundle *bundle = [NSBundle mainBundle];
    NSString *storyboardName = [bundle objectForInfoDictionaryKey:key];
    return [UIStoryboard storyboardWithName:storyboardName bundle:bundle];
}

回到你的问题,我的LaunchViewController提供了一个方法,它给出了一个主故事板视图控制器(带有你选择的动画)给出它的故事板标识符......

// LaunchViewController.m
+ (void)presentUI:(NSString *)identifier {
    UIStoryboard *storyboard = [self storyboardWithKey:@"UIMainStoryboardFile"];
    UINavigationController *vc = [storyboard instantiateViewControllerWithIdentifier:identifier];

    UIWindow *window = [UIApplication sharedApplication].delegate.window;
    window.rootViewController = vc;

    [UIView transitionWithView:window
                      duration:0.3
                       options:UIViewAnimationOptionTransitionCrossDissolve
                    animations:nil
                    completion:nil];
}

有了这个,我们可以给LaunchViewController任意数量的公共方法,比如......

+ (void)presentLoginUI {
    [self presentUI:@"IdentifierOfMyLoginViewController"];
}

+ (void)presentMainAppUI {
    [self presentUI:@"IdentifierOfMyMainAppViewController"];
}

由于系统窗口只有指向根视图控制器的指针,并且您在presentUI:中替换了该指针,因此ARC将为您清理整个丢弃的UI。