我的应用程序以我的登录屏幕作为初始VC进行实例化。当用户成功登录时,我实例化导航控制器并将homeVC设置为根视图控制器。一旦登录,用户可以从应用中的任何页面访问他们的“我的个人资料”信息,以及退出。
将“返回”转换为登录视图控制器的最佳方法是什么?我想确保从内存中删除任何VC,但由于登录VC存在于导航控制器之外,我不能简单地跳回到根视图控制器。
感谢任何指导。
答案 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。