在目标视图控制器中检测导航弹出

Detect navigation pop in destination view controller

在Xamarin.iOS中使用UINavigationController(目标iOS 11/12)我想在目的地视图中检测当我被导航 返回 到 - 即流行音乐时的控制器。当目的地 VC 第一次被 推送 时,我特别想 exclude/detect。

明确地说,假设我们已经从 A 导航到 C,然后返回 B:

[A] -(push)-> [B] -(push)-> [C] -(pop)-> [B]

我想 detect/discriminate - in B - 在 A -> B 的初始推送和 C -> B 的后续弹出之间。

从概念上讲,这与 and 提出的问题相同,我应该 - 显然 - 能够在 ViewWillAppear() 但是,在尝试了两个链接问题(以及其他一些问题)中的方法后,我没有看到这些属性的预期值;他们总是 FalseView.Window 总是 null

这是 Xamarin.iOS 特有的怪癖,还是我遗漏了什么?如果它与 Xamarin 相关,是否有解决方法?如果没有,是否有人有此检测工作的基本 C# 示例?

我不想在导航控制器(或委托,或个人 VCs)中维护状态,因为应用程序结构将来可能会发生变化。但是,使用导航控制器或委托指示导航方向(弹出与推送)到目的地 VC - 'B' 的解决方案是可以接受的。

如果您想操纵导航操作,isMovingToParentViewController 应该可以。将它放在你的 B 控制器的视图中将出现生命周期事件:

public override void ViewWillAppear(bool animated)
{
    base.ViewWillAppear(animated);

    if (IsMovingToParentViewController)
    {
        // Come from A
    }
    else
    {
        // Pop from C
    }
}

这是效果,我在iOS12:

上测试过

另一种检测方法是: 当你想从 A 推送 B 时,你必须初始化一个新的 B 来推送,这样 B 的 ViewDidLoad 事件将被调用。从 C 弹出时,B 已经存在于您的导航堆栈中,因此 ViewDidLoad 不会被触发。