如何可靠地检测到UIViewController已被解除

时间:2014-11-19 13:14:20

标签: ios uiviewcontroller xamarin dismiss

当ViewController被解雇时我需要做的事情,即:

  • 按“Back”时
  • 当父级调用popToRootViewController时,如果是在UINavigationController中
  • 当父母调用DismissViewController时,如果它被呈现

例如,我需要取消订阅活动,或者减少提出的提醒等。

当popToRootViewController由其父级调用时,不会调用ViewWillDisappear,因此无效。

WillMoveToParentViewController仅适用于View Controller Contament

Dealloc并不好,因为那只是在收集垃圾时。无论如何我都在使用c#Xamarin而且它在那里不起作用。

不再使用ViewDidUnload,而且从来没有用过这个

ViewController本身不应该关心它是如何呈现的,所以我们如何找出它何时被解雇?

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

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

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

3 个答案:

答案 0 :(得分:1)

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

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

-viewDidDisappear& -viewWillDisappear仅在视图停止可见时调用(想象一下;))。因此,一次弹出一个视图时它们没问题,但不是popToRoot或一次弹出几个控制器

-willMoveToParentViewController应该可以工作(UINavigation控制器中的viewControllers包含在该控制器中)但由于某种原因,我发现它何时被调用时会出现不一致。

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

答案 1 :(得分:1)

我已经从我的模态中调用了showsViewController.viewWillAppear来让它知道它被解雇了。

答案 2 :(得分:-1)

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

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

如果您在Xamarin Studio中使用故事板功能可能会有所帮助,因为NavigationController-> UIViewController关系是可视化表示的。

如果您遇到进一步的麻烦,请发布示例代码,以便社区进一步审核。