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

时间:2019-05-21 10:24:41

标签: ios cocoa-touch xamarin.ios uinavigationcontroller

我想在Xamarin.iOS中使用UINavigationController(定位到iOS 11/12),当我导航到 back时,我想在目的地视图控制器中进行检测至-即流行音乐。我特别想排除/检测目标VC第一次被按下的时间。

为了明确起见,假设我们已经从A导航到C,然后又回到B:

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

我想检测/区分B中的 -从A -> B的初始推送到C -> B的后续弹出之间。

从概念上讲,这与所提出的问题herehere是相同的,而且显然-我应该能够使用isMovingToParentViewController / IsBeingPresented / {{1 }}在View.Window中进行了尝试,但是在尝试了两个链接问题(以及其他一些事情)中的方法之后,我没有看到这些属性的期望值;它们总是ViewWillAppear(),而False总是View.Window

这是Xamarin.iOS特有的怪癖,还是我缺少某些东西?如果与Xamarin有关,是否有解决方法?如果没有,那么有人没有这种检测工作的准C#示例吗?

我希望不必在导航控制器(或委托或单个VC)中保持状态,因为将来应用程序结构可能会更改。但是,使用导航控制器或委托来指示到目标VC的导航方向(弹出或推入)的解决方案-上面的“ B”是可以接受的。

1 个答案:

答案 0 :(得分:0)

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

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

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

这是效果,我在iOS 12上进行了测试:

enter image description here

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