【问题标题】:How to reliablly detect that a UIViewController has been dismissed如何可靠地检测到 UIViewController 已被解除
【发布时间】:2015-01-17 00:36:49
【问题描述】:

我需要在 ViewController 被解除时做一些事情,即:

  • 按下“返回”时
  • 当 popToRootViewController 在 UINavigationController 中被父级调用时
  • 当 DismissViewController 被父级调用时

例如,我需要取消订阅事件,或关闭显示的警报等。

当 popToRootViewController 被其父级调用时,ViewWillDisappear 不会被调用,因此不起作用。

WillMoveToParentViewController 仅用于 View Controller 包含

Dealloc 不好,因为只有在垃圾收集时才会这样做。无论如何,我都在使用 c# Xamarin,但它在那里不起作用。

ViewDidUnload 不再被使用,也从来没有用于此

ViewController 本身不应该关心它是如何呈现的,那么我们如何找出它何时被关闭?

这似乎是一个重要的基本要求。例如,如果没有这个,我们如何取消订阅来自模型的事件?

这是一个类似的问题,但没有好的答案:

Can you detect when a UIViewController has been dismissed or popped??

【问题讨论】:

  • 也许这会对你有所帮助 - stackoverflow.com/questions/26921227/…
  • 建议使用自 ARC 以来我们不使用的 dealloc,并且无论如何在 Xamarin 中都不起作用
  • 你告诉谁我们不在 ARC 中使用 -dealloc。是释放资源必不可少的方法,那你在哪里释放delegate呢?
  • 嗯,好的,在 C# Xamarin 中等效的是 Dispose,但仅在内存被垃圾收集时调用。我真的想做一些事情,比如删除一个呈现的警报(使用 UIAlertController),所以需要立即发生。如果你明白我的意思,垃圾收集可能不会发生很长时间。
  • 是的,但是我什么时候可以调用 dispose。我不关心释放内存,这是自动发生的。我需要知道的是 UIViewController 已被解除,所以我可以在 UI 中做一些事情,例如删除警报等

标签: ios uiviewcontroller xamarin dismiss


【解决方案1】:

这个问题有点老了,但这是我得出的结论:

-dealloc - 不保证何时调用它。适合样板代码,但不可靠。

-viewDidDisappear & -viewWillDisappear 仅在视图停止可见时调用(想象一下 ;))。因此,一次弹出一个视图时它们是可以的,但对于 popToRoot 或一次弹出多个控制器则不行

-willMoveToParentViewController 应该可以工作(UINavigation 控制器中的视图控制器包含在该控制器中)但由于某种原因,我看到它何时被调用并不一致。

-didMoveToParentViewController - 确实会在从导航堆栈中解除的每个 viewController 上调用。所以...这看起来是最可靠的地方。

【讨论】:

    【解决方案2】:

    我已经从我的模式中调用了presentingViewController.viewWillAppear,让它知道它正在被解除。

    【讨论】:

      【解决方案3】:

      当使用 UINavigationController 时,它可以通过 UIViewController(或等效的)子类对象上的 NavigationController 属性获得。

      当一个新的 UIViewController 被加载到 UINavigationController 堆栈时,ViewWillDisappear(bool animated)ViewDidDisappear(bool animated) 将被调用。

      如果您利用 Xamarin Studio 中的情节提要功能可能会有所帮助,因为 NavigationController->UIViewController 关系是直观表示的。

      如果您还有其他问题,请发布示例代码,以便社区进一步审查。

      【讨论】:

      • 是的,但正如我所说,当它的父级调用 popToRootViewController 时,不会调用 ViewWillDisappear
      猜你喜欢
      • 1970-01-01
      • 2020-03-08
      • 1970-01-01
      • 2015-01-15
      • 2013-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-30
      相关资源
      最近更新 更多