我刚刚开始 iOS 编程,到目前为止,我在这里找到的教程和答案对我的前进有很大帮助。然而,这个特殊的问题整夜困扰着我,我找不到“感觉正确”的答案。
我正在编写一个连接到远程服务的应用程序,用户需要登录才能使用它。当他们开始使用应用程序时,他们的第一个视图应该是登录对话框;当他们之前进行身份验证时,他们会立即看到概述页面。
该项目使用故事板 - 我认为这是一个很棒的功能 - 因此大多数选择和加载根视图控制器的代码已经被处理。我认为添加逻辑的最佳位置是application:didFinishLaunchingWithOptions:
的方法AppDelegate
:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:
(NSDictionary *)launchOptions
{
// select my root view controller here based on credentials present or not
return YES;
}
但这带来了两个问题:
在这个特定的委托方法中,根视图控制器已经根据故事板被选择(并加载?)。我是否可以移动到加载过程中的较早位置来覆盖第一个视图控制器选择,或者这会使事情不必要地复杂化?
要覆盖第一个视图控制器,我需要对故事板的引用,但我找不到比使用更好的方法storyboardWithName:bundle:
的构造函数UIStoryboard
。这感觉不对,应用程序应该已经有对故事板的引用,但是我如何访问它?
Update
我解决了遇到的第二个问题,因为我在这里找到了答案:
UIStoryboard:获取活动故事板的正确方法是什么?
NSBundle *bundle = [NSBundle mainBundle];
NSString *sbFile = [bundle objectForInfoDictionaryKey:@"UIMainStoryboardFile"];
UIStoryboard *sb = [UIStoryboard storyboardWithName:sbFile bundle:bundle];
以上将创建一个新的故事板实例;要获取活动实例,要简单得多:
UIStoryboard *sb = [[self.window rootViewController] storyboard];
在故事板文件本身中,您必须为要加载的视图设置一个标识符,例如LoginDialog
。然后你像这样实例化视图:
LoginViewController *login = [sb instantiateViewControllerWithIdentifier:@"LoginDialog"];
[self.window setRootViewController:login];
在另一个视图控制器中,以下内容就足够了:
UIStoryboard *sb = self.storyboard;
LoginViewController *login = [sb instantiateViewControllerWithIdentifier:@"LoginDialog"];
[self presentViewController:login animated:NO completion:nil];