2012-12-21 72 views
1

我有一堆UIViewController的子类。每个修改一个NSManagedObject模型。他们中的许多人还展示了他们自己的模态视图控制器。UINavigationController - 在弹出视图控制器之前运行代码

当用户'弹出'视图控制器或推动下一个视图控制器时,我需要保存更改到NSManagedObjectContext

目前,我隐藏了默认后退按钮,并设置了我自己的UIBarButtonItem,其中targetself和自定义action

这工作正常,但理想情况下,我想使用默认后退按钮并在弹出之前运行代码。有没有一种方法可以在弹出之前运行我自己的代码?

(我宁愿不把代码放入viewWillDisappear,因为持久化到磁盘可能很昂贵,而且这种方法也可以通过视图控制器显示的模态来触发。)可以这样做吗?

回答

3

你可以做到这一点在viewDidDisappear,检查self要么是1)最后在self.navigationController.viewControllers(元素下一个VC刚推)或2)self.navigationControllernil的情况后(self VC刚弹出)。

+0

所以你是说'self.navigationController'设置为'nil'之前调用'viewDidDisappear'(如果发生弹出)?尽管...可以安全地假设在未来的iOS版本中,这仍然是真的吗?这是由Apple记录的吗? –

+1

我不知道它是否有记录,但行为已经很长时间了。您可以检查两个案例,以确保安全:'self.navigationController == nil || self不在self.navigationController.viewControllers' – tom

+0

那么,Apple文档暗示至少:'这种方法从堆栈中删除顶部视图控制器,并使堆栈的新顶部成为活动视图控制器。如果堆栈顶部的视图控制器是根视图控制器,则此方法不执行任何操作。换句话说,你不能弹出堆栈中的最后一个项目。' –

1

是..导航控制器在你的代码的委托指示当一个视图控制器弹出或推..你可以用它来干你的任务......

+0

其实,我不相信这是这种情况,或者至少我没有看到它......这里是文档:http://developer.apple.com/library/ios/#documentation/uikit/reference/UINavigationControllerDelegate_Protocol /Reference/Reference.html我也期待它在这里,但它只有**显示**视图控制器的方法...:/ –

+0

是的..使用这些方法,你可以检查显示哪个视图控制器。 例如:A显示B,然后B显示C 现在,当C弹出时,将调用委托方法(willShowViewController),告诉B正在显示。 现在,如果topViewController是A,那么B会被推送, ,如果topViewController是C,那么B会变得可见,因为C会弹出。 –

+0

我看到你在做什么,我可以看到如何实现它,但我认为检查'self.navigationController == nil'是否是我的情况中最简单和最好的解决方案。不过,建议的+1。谢谢! –

0

添加下面的方法:

- (void) viewWillDisappear:(BOOL)animated{ 
    //your code here 
} 
0

我使用viewWillDissappear使任何更改持续。 如果需要我使用viewWillAppear来识别可能发生的任何更改(重新加载数据),而其他puhed view controlers完成了他们的工作。

相关问题