【问题标题】:ViewWillAppear & ViewDidAppear firing when dismissing ViewController关闭 ViewController 时触发 ViewWillAppear 和 ViewDidAppear
【发布时间】:2015-03-04 04:35:40
【问题描述】:

我正在制作一个 iOS 应用程序,我想在其中显示如下页面流:

基本上我要实现的就是有这样的页面流:

PageA
PageB
PageC
PageD, dismiss back to:
PageC
PageD
PageE, dismiss back to:
PageA (starting point, start over again)

我使用ShowViewcontroller 来呈现页面(模态)并使用DismissViewcontroller 来关闭。

根据 Apple 的文档,如果我在堆栈的早期解除 VC,则所有后续的 UIViewCOntroller 也会被解除 (Apple doc)。

但是我体验到 ViewWillAppearViewDidAppear 会在 UIViewController 上被触发,即使它们没有出现也会被解雇(例如,在示例中,当从 PageE 然后 ViewWillAppear 解雇回 PageA 时也被PageDPageCPageB 调用)。

这对我来说似乎不合逻辑。谁能解释为什么会这样?如果我以错误的方式处理这个问题,也许可以纠正我。

我正在使用 Xamarin.iOS。

苹果文档: 如果您连续呈现多个视图控制器,从而构建一个呈现视图控制器的堆栈,则在堆栈中较低的视图控制器上调用此方法会解除其直接子视图控制器以及堆栈上该子视图控制器上方的所有视图控制器。发生这种情况时,只有最顶层的视图会以动画方式消失;任何中间视图控制器都简单地从堆栈中删除。最顶层的视图使用其模态转换样式被解除,这可能与堆栈中其他视图控制器使用的样式不同。

【问题讨论】:

  • 使用 modal 有什么具体要求吗?我认为您应该使用导航控制器来获得此流程。模态不是用来导航的,它是弹出一些信息的东西。
  • @SharonNathaniel - 没有具体要求。但是我只是使用模态来避免删除导航栏等(它应该不可能向后导航)。实际上页面是不相关的。什么惯用语通常用于在不相关的页面之间导航,有过渡,但应该不能导航回来等。
  • 您可以使用导航控制器,并在您不希望用户返回的特定视图控制器上隐藏返回按钮。当你想回到根视图控制器时,只需 popToRootViewController。
  • 我也有这个问题。我的解决方法是使用标志来控制这种行为

标签: ios uiviewcontroller navigation xamarin


【解决方案1】:

ViewController 使用堆栈。每当将新的 ViewController(任何类型)添加到堆栈中时,您都会失去对 ViewControllers 的越来越多的控制权(尤其是在为 ViewControllers 使用模式时)。因此,假设您的堆栈中有 5 个 ViewController(A、B、C、D、E,根据您的示例),并假设它们按所述顺序创建,为了从 ViewController E 返回到 ViewController A,您'd 必须通过整个堆栈。这意味着需要首先显示您的方式中的每个 ViewController,以便关闭它(因为您已经显示了 ViewController E,所以这里不会发生)。

我希望这对你有帮助。祝你好运!

爱与问候, 比约恩

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-19
    • 2011-04-03
    • 2011-01-19
    • 2012-08-26
    • 2012-10-11
    • 2011-08-03
    • 2012-12-11
    • 1970-01-01
    相关资源
    最近更新 更多