【问题标题】:ios dismiss a controller and present a controller with animationios 关闭控制器并显示带有动画的控制器
【发布时间】:2014-03-26 21:51:26
【问题描述】:

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

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

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

  2. 我已尝试使用以下方法关闭并显示这两个控制器:

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

TLDR:

我有一个以rootViewController-&gt;viewController1 开头的模态视图层次结构,我想转换到rootViewController-&gt;viewController2,其中viewController1 向下动画以显示viewController2

【问题讨论】:

  • 看这个:stackoverflow.com/questions/19962276/… 可能对你有帮助,涵盖了登录过程的整个概念。
  • 这不是我想要的。该解决方案知道用户根控制器应该是什么样子。在我的示例中,在身份验证过程之后,我不确定用户控制器将是什么。

标签: ios objective-c uiviewcontroller


【解决方案1】:

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

从那里您将实例化三个视图控制器之一并将其推送到导航堆栈中 - 如果您愿意,可以使用情节提要执行此操作,方法是将情节提要 ID 设置为一个值,然后使用情节提要 ID 实例化 VC。

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

一个

编辑:实例化后,您需要向视图控制器展示动画

【讨论】:

  • 这意味着身份验证控制器仍然是模态视图层次结构的一部分。这是我不惜一切代价试图避免的。
  • 如何通过动画强制切换到下一个 VC 或者您可以将导航控制器设置为堆栈中的所有视图,然后弹出到您需要的级别(尽管这可能不是您想要的想要...)
【解决方案2】:

-dismissViewControllerAnimated:completion:documentation 声明:

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

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

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

- (void)viewWillAppear {
    if (!userLoggedIn) {
        UIViewController *vc1 = [[YourViewControllerClass1 alloc] init];
        [self presentViewController:vc1  animated:YES completion:nil];
    }
}

当用户点击vc1 中的Show Login VC 按钮时,您会从那里显示登录视图控制器:

- (IBAction)touchUpInsideShowLoginVCButton:(id)sender {
    UIViewController *loginVC = [[YourLoginViewControllerClass alloc] init];
    loginVC.delegate = self.presentingViewController;
    [self presentViewController:loginVC  animated:YES completion:nil];
}

您还在这里将vc2 设置为loginVC 的委托,因为您需要在loginVC 中引用vc2。 (需要在loginVC的.h文件中定义一个属性delegate:)

@property (strong, nonatomic) UIViewController *delegate;

最后,当用户点击Login 按钮并且登录成功时,您同时关闭两个视图控制器(只需在层次结构中最低的vc2 上调用-dismissViewControllerAnimated:completion:),以便首次公开vc2

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

【讨论】:

    【解决方案3】:

    我认为presentViewController 不支持在最上面的presentedViewController 下方插入viewController,也就是这里的认证控制器。如果你有rootViewController的navigationController,你可以尝试pushViewController:animated:,然后再dismiss authentication controller,push Animation可以是NO;

    【讨论】:

      猜你喜欢
      • 2016-06-18
      • 2016-11-27
      • 2018-06-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 2017-04-17
      • 1970-01-01
      相关资源
      最近更新 更多