在应用程序启动时从故事板中选择备用第一视图控制器

Ja͢*_*͢ck 15 iphone storyboard ios5

我刚开始学习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;
}
Run Code Online (Sandbox Code Playgroud)

但这提出了两个问题:

  1. 在这个特定的委托方法中,根据故事板已经选择(并加载了?)根视图控制器.我可以移动到加载过程中的早期位置来覆盖第一个视图控制器选择,还是会使问题不必要地复杂化?

  2. 要覆盖第一个视图控制器,我需要对故事板的引用,但我找不到比使用storyboardWithName:bundle:构造函数更好的方法UIStoryboard.这感觉不对,应用程序应该已经有了故事板的参考,但我怎样才能访问它?

更新

我找到了我遇到的第二个问题,因为我在这里找到了答案:

UIStoryboard:获取活动故事板的正确方法是什么?

NSBundle *bundle = [NSBundle mainBundle];
NSString *sbFile = [bundle objectForInfoDictionaryKey:@"UIMainStoryboardFile"];
UIStoryboard *sb = [UIStoryboard storyboardWithName:sbFile bundle:bundle];
Run Code Online (Sandbox Code Playgroud)

以上将创建一个新的故事板实例; 获取活动实例,它更简单:

UIStoryboard *sb = [[self.window rootViewController] storyboard];
Run Code Online (Sandbox Code Playgroud)

在故事板文件本身中,您必须为要加载的视图设置标识符,例如LoginDialog.之后,您实例化视图,如下所示:

LoginViewController *login = [sb instantiateViewControllerWithIdentifier:@"LoginDialog"];
[self.window setRootViewController:login];
Run Code Online (Sandbox Code Playgroud)

在另一个视图控制器中,以下内容足够:

UIStoryboard *sb = self.storyboard;
LoginViewController *login = [sb instantiateViewControllerWithIdentifier:@"LoginDialog"];
[self presentViewController:login animated:NO completion:nil];
Run Code Online (Sandbox Code Playgroud)

Dan*_*Liu 13

您只需重置窗口的根视图控制器即可

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:
      (NSDictionary *)launchOptions
{
   if(your_condition) {
       UIViewController *newRoot = [your implementation];
       self.window.rootViewController = newRoot;
   }
   return YES;
}
Run Code Online (Sandbox Code Playgroud)

这对我来说很有用,Xcode5.0.1

  • `/*对于故事板...*/self.window.rootViewController =(YourViewController*)[[UIStoryboard storyboardWithName:@"Main"bundle:nil] instantiateViewControllerWithIdentifier:@"YourViewControllerID"];` (5认同)

ovi*_*diu 7

我和你的情况类似.我的应用程序使用a UINavigationController作为根视图控制器.如果用户已登录,我想向他/她展示NotLoggedInViewController,而如果它已登录我想要显示LoggedInViewController.

在故事板UINavigationController中,只能有一个子节点,因此您必须能够以编程方式为其分配另一个根视图控制器.

我首先创建一个自定义导航控制器类,让我们命名MyNavigationController.在故事板中,我将此自定义类分配给导航控制器对象.

仍然在故事板中,然后我为两个视图控制器建模,并将其中一个连接到导航控制器对象.由于我以后需要能够从我的代码中访问它们,因此我使用右侧的XCode检查器为每个代码分配一个标识符.这些标识符可以是任意字符串,但对于简单的事情我只使用类名.

最后我然后viewDidLoadMyNavigationController类上实现该方法:

BOOL isLoggedIn = ...;

- (void)viewDidLoad {
  id rootController;
  if (isLoggedIn) {
    rootController = [self.storyboard instantiateViewControllerWithIdentifier:@"LoggedInViewController"];
  } else {
    rootController = [self.storyboard instantiateViewControllerWithIdentifier:@"NotLoggedInViewController"];
  }
  self.viewControllers = [NSArray arrayWithObjects:rootController, nil];
}
Run Code Online (Sandbox Code Playgroud)