【问题标题】:Dismiss modal view then perform segue to open a second modal view关闭模态视图,然后执行 segue 以打开第二个模态视图
【发布时间】:2012-05-14 03:57:49
【问题描述】:

我有一个允许用户登录和注册的 HomeController。如果用户点击登录,我会使用 segue 打开一个模态视图。

在模态视图中有一个按钮,上面写着注册。所需的操作是关闭登录模式视图,然后使用performSegueWithIdentifier: 打开注册模式视图

- (void)loginControllerDidRegister:(LoginController *)controller sender:(id)sender
{
    NSLog(@"loginControllerDidRegister");
    [self dismissViewControllerAnimated:YES completion:nil];
    [self performSegueWithIdentifier:@"RegistrationSegue" sender:sender];
}

这会正确关闭模态视图,然后调用performSegueWithIdentifier:,我有记录代码显示它正在被调用,就像我按下了注册按钮一样。

我认为登录模态视图消失的动画可能会干扰第二个模态视图的显示。关于如何解决此问题的任何想法?

【问题讨论】:

  • 不是对您的具体问题的回答,而是关于两阶段视图序列的问题,我不喜欢多个动画 - 太分散注意力 + 暗示了不同的上下文 - 所以我最终填充了一个具有两个视图阶段的滚动视图并以模态方式呈现。在模态滚动视图中以编程方式滑动到第二个视图效果很好。所以,类似问题的不同解决方案。

标签: ios cocoa-touch modalviewcontroller uistoryboard uistoryboardsegue


【解决方案1】:

您需要启动“第二模式”vc。这就是“prepareForSegue:”方法的作用。您还需要覆盖“执行:”方法。这将比您想象的要复杂一些。如果有帮助,这里是segue如何工作的细分......

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender;

被调用并传入“segue”。幕后花絮

- (id)initWithIdentifier:(NSString *)identifier source:(UIViewController *)source destination:(UIViewController *)source;

被调用,这就是创建“segue”的地方。

“segue”对象具有以下属性

(NSString *)identifier
(UIViewController *)sourceViewController
(UIViewController *)destinationViewController

没有这些,segue 就无法执行。这些类似于手动分配视图控制器

SomeViewController *secondView = [SomeViewController alloc] initwithNibName:@"SomeViewController" bundle:nil];

然后

[[segue destinationViewController] setModalTransitionStyle:UIModalTransitionStyle(...)];

这是……

secondView.modalTransitionStyle = UIModalTransitionStyle(...);

(...) 将是故事板中选择的“segue”过渡。

最后

[[segue sourceViewController] presentModalViewController:destinationViewController animated:YES];

这只是

[self presentModelViewController:secondView animated:YES];

是让这一切发生的原因。您基本上将不得不调整引擎盖下的那些事情以获得您想要的工作,但它是可行的。

【讨论】:

    【解决方案2】:

    您必须将第二个模态视图控制器的 performSegue 放在 dismissViewControllerAnimated 调用的完成块中。 UINavigationController 在呈现其他模态视图控制器时无法处理呈现。

    【讨论】:

      【解决方案3】:

      如果有人有同样的问题。

      - (void)loginControllerDidRegister:(LoginController *)controller sender:(id)sender
      {
          NSLog(@"loginControllerDidRegister");
          [self dismissViewControllerAnimated:YES completion:^{
              [self performSegueWithIdentifier:@"RegistrationSegue" sender:sender];
          }];  
      }
      

      【讨论】:

      • 这不应该/不会起作用,因为如果您的“自我”不再存在,您将无法执行转场
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-08
      • 2012-01-20
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多