ios关闭控制器并向控制器显示动画

时间:2014-02-24 23:16:26

标签: ios objective-c uiviewcontroller

我有一个根视图控制器,它提供了一个身份验证视图控制器。一旦用户进行身份验证,我需要关闭身份验证控制器并提供用户特定的控制器(例如:登机控制器,普通用户控制器,专业用户控制器)。我想要发生的是当身份验证控制器被动画化时,会显示相应的控制器(就好像它是在身份验证控制器之前呈现的那样)。

这是我到目前为止尝试的两种解决方案。两者都显示转换之间的根视图控制器。

  1. 在根视图控制器的-viewDidAppear中,我提供了相应的控制器(身份验证或用户特定的控制器)。

  2. 我试图使用以下内容解散并显示两个控制器:

    [authenticationController dismissViewControllerAnimated:<NO|YES> completion:^{
        [userController presentViewController:viewController animated:animated completion:nil];
    }];
    
  3. TLDR:

    我有一个模态视图层次结构,它像rootViewController->viewController1一样开始,我希望转换到rootViewController->viewController2,其中viewController1动画下来显示viewController2

3 个答案:

答案 0 :(得分:0)

用户完成身份验证后,为您设置一个有意义值的标志,然后让我们说一旦他们点击OK或提交,您就可以检查并设置标志。

从那里,您将实例化三个视图控制器中的一个并将其推送到导航堆栈中 - 如果您愿意,可以通过将故事板ID设置为值然后使用故事板ID实例化VC来执行此操作。

如果您需要更多说明或如果这不是正确的曲目,请告诉我。

A

编辑:一旦实例化,您将需要使用动画呈现视图控制器

答案 1 :(得分:0)

-dismissViewControllerAnimated:completion:州的documentation

  

如果您连续呈现多个视图控制器,从而构建一堆呈现的视图控制器,则在堆栈中较低的视图控制器上调用此方法会解除其直接子视图控制器以及堆栈上该子视图上方的所有视图控制器。发生这种情况时,只有最顶层的视图以动画方式被删除;任何中间视图控制器都可以从堆栈中删除。

因此,实现这种行为的一种方法是安排你的视图控制器:

Storyboard Screenshot

您将要在登录后显示的视图控制器vc2放在第一个位置。在vc2的{​​{1}}方法中,如果用户未登录,您转到-viewWillAppear

vc1

当用户点击- (void)viewWillAppear { if (!userLoggedIn) { UIViewController *vc1 = [[YourViewControllerClass1 alloc] init]; [self presentViewController:vc1 animated:YES completion:nil]; } } 中的Show Login VC按钮时,您会从那里显示登录视图控制器:

vc1

您还可以将- (IBAction)touchUpInsideShowLoginVCButton:(id)sender { UIViewController *loginVC = [[YourLoginViewControllerClass alloc] init]; loginVC.delegate = self.presentingViewController; [self presentViewController:loginVC animated:YES completion:nil]; } 设置为vc2的委托,因为您需要在loginVC中引用vc2。 (您需要在loginVC的.h文件中定义属性delegate:)

loginVC

最后,当用户点击@property (strong, nonatomic) UIViewController *delegate; 按钮并且登录成功时,您同时关闭两个视图控制器(只需在Login上调用-dismissViewControllerAnimated:completion:,这是最低的vc2层次结构)以便第一次显示vc2

- (IBAction)touchUpInsideLoginButton:(id)sender {
    // ... your login code
    if (loginSuccessful) {
        [self.delegate dismissViewControllerAnimated:YES completion:nil];
    }
}

答案 2 :(得分:0)

我认为presentViewController不支持在顶部的presentViewController下面插入一个viewController,这是一个身份验证控制器。如果你有一个用于rootViewController的navigationController,你可以在关闭认证控制器之前尝试pushViewController:animated:,推动动画可以是NO;