使用过渡委托时触发viewWillAppear

pec*_*eco 3 uiviewcontroller ios swift

我想提出一个视图控制器:

  • 模态地
  • 使用自定义过渡
  • 同时,我想确保当它被关闭时,它后面的视图控制器知道被推到了前台

我的基本想法是尝试一些不同的配置,然后看看哪种配置会导致viewWillAppear在后面的视图控制器上被调用。

尝试1

presentedViewController.modalPresentationStyle = .Custom
presentedViewController.transitioningDelegate = someTransitioningDelegate
Run Code Online (Sandbox Code Playgroud)

此方法的结果:

  • 自定义过渡效果很好
  • viewWillAppear没有得到所谓背后的视图控制器上presentedViewController,当我打电话presentedViewController.dismissViewControllerAnimated(true)

我确实希望viewWillAppear在被解雇的视图控制器下面调用它,所以我这样做了:

尝试2

presentedViewController.modalPresentationStyle = .FullScreen
presentedViewController.transitioningDelegate = someTransitioningDelegate
Run Code Online (Sandbox Code Playgroud)

要么

presentedViewController.modalPresentationStyle = .FullScreen
presentedViewController.modalTransitionStyle = .CoverVertical
presentedViewController.transitioningDelegate = someTransitioningDelegate
Run Code Online (Sandbox Code Playgroud)

此方法的结果:

  • viewWillAppearpresentedViewController解雇时在后面的视图控制器上被调用presentedViewController
  • 呈现视图控制器时,过渡会按预期发生。
  • 关闭视图控制器时,过渡期间的背景为黑色,这是不希望的。

似乎.FullScreen导致后面的视图控制器presentedViewController从显示层次结构中删除-这很好,因为大概是触发该viewWillAppear调用的原因。

尝试3

presentedViewController.modalPresentationStyle = .FullScreen
presentedViewController.modalTransitionStyle = .CoverVertical
Run Code Online (Sandbox Code Playgroud)

结果是:

  • viewWillAppear在后面的视图控制器上被调用presentedViewController
  • 过渡期间的背景是位于后面的视图控制器presentedViewController
  • 没有自定义过渡。

我的工作项目的方式,使得它很难使用授权(这似乎是建议的答案被结构在这里)。利用NSNotificationCenter是另一种选择,它可以让我调用应该由调用的代码viewWillAppear,但是从尝试3开始,我希望有一种更优雅的方法来实现所有这些目标:

  1. 触发 viewWillAppear
  2. 使用自定义过渡
  3. 看到过渡动画期间在后台呈现的视图控制器

pec*_*eco 5

似乎Apple认为调用viewWillAppearetc 是犯规的,但是可以调用beginAppearanceTransitionand endAppearanceTransition而后者又会调用viewWillAppear。我要用这个。