在iOS4中,当一个视图控制器即将被弹出时,收到通知

10

这个问题之前已经有人问过,但我能找到的回答都是2009年的,不适用于我的问题。让我再重申一下问题。

我有一个UINavigationController,它会产生并将许多不同的UIViewController推入其堆栈中。其中一个处理一些需要在该特定VC弹出堆栈时保存的Core Data操作。不要关注Core Data部分,重点在于弹出。

如何挂钩到UIViewController即将从堆栈中弹出的时刻?

  • 我希望能找到某种委托方法,但找不到。 UINavigationControllerDelegate协议非常简洁。
  • 然后我开始考虑使用viewWillDisappear,但是如果另一个视图被推入堆栈上,那么也会调用该方法,因此它不提供正确的时机。
  • 这篇2009年的回答文章选择查看我们要“弹出到”的视图控制器的viewWillAppear,但由于该调用没有参考需要进行检查的VC,因此这是不令人满意的,并且会引入一种不利于生产的依赖关系(该VC由多个NC使用)。
  • 另一个2009年的回答文章选择子类化UINavigationController并重写popViewControllerAnimated:方法。或者使用VC的dealloc。我的直觉告诉我这不能成为解决方法。
  • 最后有一个来自2011年3月的问题,但没有人关心它。

这让我陷入了目前不满意的状态。有没有人有更好的解决方案来找到您的UIViewController从UINavigationController的堆栈中弹出的时刻?

祝好,
EP.


我遇到了同样的问题。不过,根据http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/DeprecationAppendix/AppendixADeprecatedAPI.html,viewDidUnload和viewWillUnload在iOS6下已经被弃用。 - Hana Ibrahim
2个回答

9

非常准确,将其封装在类别中并且运行得很好。感谢@Jason! - epologee
9
我刚看了一下你的回答。它看起来不错,但对于实际需要的内容有点过于复杂。我建议可以更简洁一些:if (![self.navigationController.viewControllers containsObject:self]) { //已弹出! } - Pier-Olivier Thibault
好的。在导航控制器栈中有相同的视图控制器也很奇怪。干杯! - epologee
@Pier,说得好。那个答案中有些过时的代码。我只是传达了要使用的适当委托。感谢您的更新。 - Jason McCreary

0

我认为在这方面我会采取另一种方法,尝试从各个视图控制器中捕获轮询而不是导航控制器。对于单个视图控制器来说,弹出看起来像是被释放了,这是完全可钩住的。

子类化UIViewController,在其-dealloc中实现您的通知。一定要调用[super dealloc]

然后,每个您推入导航控制器的视图都应该子类化您的新自定义视图控制器子类。他们可以在自己的viewDidUnload中做任何他们想做的事情,然后调用[super dealloc](在这种情况下,super是您的UIViewController子类)来触发通知。


这样做行不通。如果你从导航控制器栈中弹出一个视图控制器,它不会经过-viewDidUnload方法。 - Pier-Olivier Thibault
@Pier - 你确定吗?我以前做过这样的事情,但已经有一段时间了... 我可能捕获了 dealloc 吗? - Dan Ray
是的,-dealloc方法被调用了。viewDidUnload方法只有在视图控制器接收到内存警告并且不是顶层视图控制器时才会被调用。 - Pier-Olivier Thibault
实际上,如果视图控制器在某个地方是持久的,即在它消失的同时没有被释放,dealloc不一定会被调用。然而,Jason提到的其他问题确实很有道理。谢谢! - epologee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接