【问题标题】:iOS - Transition between different Storyboard view controllersiOS - 不同 Storyboard 视图控制器之间的转换
【发布时间】:2015-12-12 19:10:21
【问题描述】:

我将我的项目分为两个故事板:

  • Main.storyboard - 用于经过身份验证的用户。这也是默认的故事板。

  • Login.storyboard - 适用于未经身份验证的用户。

应用委托文件:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    if(user is authenticated)
    {
        [self presentLoginScreen:YES];
        return YES;
    }

应用委托文件中的登录屏幕:

-(void)presentLoginScreen:(BOOL)animated{
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Login" bundle:[NSBundle mainBundle]];
    UIViewController *vc =[storyboard instantiateInitialViewController];
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.rootViewController = vc;
}

注销时,会显示登录屏幕。我在应用程序委托文件中定义了这个:

-(void)logOut{
   //clear data

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Login" bundle:[NSBundle mainBundle]];
    UIViewController *vc =[storyboard instantiateInitialViewController];
    self.window.rootViewController = vc;
    //Show login Screen
    [self presentLoginScreen:NO];
}

从MainStoryBoard的viewcontroller(letsay mainstoryboardVc.m),logOut被调用为:

-(void)didTouchLogOut{
    NSLog(@"GoodBye");
    AppDelegate *appDelegateTemp = [[UIApplication sharedApplication]delegate];
    [appDelegateTemp logOut];
}

这导致了很多问题:

  • 首先,当我登出并进入登录界面时,我仍然可以在后台看到mainstoryboardVc.m,看起来很笨拙。

  • 我注销,重新登录并再次尝试注销,我看到以下消息:

不鼓励在分离的视图控制器上显示视图控制器

并且不显示登录屏幕。

我在网络上尝试了很多关于两个故事板之间视图控制器演示的答案,但没有保留历史,似乎没有任何效果......

【问题讨论】:

  • 所以你确实让事情变得更复杂而没有任何收获? 为什么你使用两个不同的故事板?
  • 使用 2 个故事板有什么意义?
  • 因为场景数量很大,两个组件相当独立,每个故事板都是由不同的开发人员开发的。合并两个将是最后一个选项,但如果我不必采取最后一个选项,那就太好了..

标签: ios objective-c storyboard


【解决方案1】:

要换出 UIViewControllers,在转换根视图控制器时还需要​​调用其他一些方法:

目标-c:

- (void)setRootViewController:(UIViewController *) newRootViewController {

    UIViewController* currentViewController = self.window.rootViewController;
    if (newRootViewController != currentViewController) {
        [currentViewController willMoveToParentViewController:nil];
        [currentViewController.view removeFromSuperview];
        [currentViewController removeFromParentViewController];
        self.window.rootViewController = newRootViewController;
    }
}

斯威夫特:

func setRootViewController(newRootViewController: UIViewController) {
    if let currentViewController = self.window?.rootViewController {
        if currentViewController != newRootViewController {
            currentViewController.willMoveToParentViewController(nil)
            currentViewController.view.removeFromSuperview()
            currentViewController.removeFromParentViewController()
            self.window?.rootViewController = currentViewController
        }
    }
}

【讨论】:

    【解决方案2】:

    两个UIViewController 对象是重复的,因为您为它们都设置了self.window.rootViewController。试试看;

    登录

    -(void)presentLoginScreen:(BOOL)animated{
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Login" bundle:[NSBundle mainBundle]];
        UIViewController *vc =[storyboard instantiateInitialViewController];
        self.window.rootViewController = vc;
        [self.window makeKeyAndVisible];
    }
    

    退出

    -(void)logOut{
       UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Login" bundle:[NSBundle mainBundle]];
       UIViewController *vc =[storyboard instantiateInitialViewController];
       [self presentViewController:vc animated:YES completion:nil];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-06
      • 1970-01-01
      • 2015-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多