【问题标题】:Detect navigation pop in destination view controller检测目标视图控制器中的导航弹出
【发布时间】:2019-10-07 17:26:00
【问题描述】:

在 Xamarin.iOS 中使用 UINavigationController(针对 iOS 11/12)我想在 destination 视图控制器中检测当我被导航返回 em> 到 - 即流行音乐。我特别想排除/检测目标 VC 何时被推送。

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

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

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

从概念上讲,这与 here 和 here 提出的问题相同,我应该 - 显然 - 能够在 ViewWillAppear() 中使用 isMovingToParentViewController / IsBeingPresented / View.Window 的组合,但是,已经尝试过链接问题(以及其他一些问题)中的方法,我没有看到这些属性的预期值;他们总是False,而View.Window总是null。

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

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

【问题讨论】:

  • stackoverflow.com/questions/8228411/… 的副本?当然,这与 Xamarin 无关,因此可能存在一些差异,但它所说的内容是正确的。特别是在那里看到我的答案。
  • 我不认为这是重复的,因为我有兴趣在目标 VC(重新)出现时检测更改,而不是在查看源时按下后退按钮。跨度>
  • 好的,stackoverflow.com/questions/54602662/… 的可能副本。

标签: ios cocoa-touch xamarin.ios uinavigationcontroller


【解决方案1】:

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

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

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

效果如下,我在iOS 12上测试过:

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

【讨论】:

  • 标记为正确,因为它确实回答了问题,谢谢。我的坏处:我没有提到我的三个视图控制器在一个选项卡中,而且我实际上对弹出到 A(而不是 B)感兴趣。我不认为这有什么不同。显然它确实如此。 IsMovingToParentViewController 无法区分初始加载和导航控制器根目录的弹出。我已经用一次性的firstRuninitial-true 布尔值来解决它,它在ViewDidAppear() 中变为 false。
猜你喜欢
  • 1970-01-01
  • 2014-03-21
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 2014-12-09
  • 2011-10-12
相关资源
最近更新 更多