同时引用源视图控制器和目标视图控制器

时间:2012-01-24 18:04:38

标签: objective-c ios ios5 uinavigationcontroller storyboard

我的应用程序中有一系列UIViewControllers。他们中的大多数都有导航栏,但其中一些隐藏了它。

问题在于,有时当您使用或不使用导航栏在具有或不包含导航栏的视图之间进行切换时,会有一个黑盒子在转换期间替换导航栏。这里讨论了这个问题:Hiding a UINavigationController's UIToolbar during viewWillDisappear:

这个解决方案很好,它确实摆脱了黑匣子,但我真的不希望被描述为“柴郡猫”的消失。我使用prepareForSegue,ViewWillAppear,viewWillDisappear等尝试了无数的解决方案。我能做的最好的事情就是改变黑条显示的场景。

我的意思是,两种导航栏状态(隐藏与非隐藏)之间有四种视图转换组合:

  • 隐藏 - 隐藏
  • 隐藏 - 不隐藏
  • 不隐藏 - 隐藏
  • 不隐藏 - 不隐藏

无论我尝试过什么解决方案,至少其中一种组合会导致我的黑盒子变得丑陋。我遇到的问题是,当从导航控制器的视图堆栈中弹出一个视图时,我无法找到任何可以获得对源视图控制器和目标视图控制器的引用的地方。

如果我可以在同一个事件中获得两个引用,我可以简单地确定组合是什么,并像我准备segue一样适当地处理行为。

现在,我知道“这是不可能的”是一个合理的(甚至是可能的)答案,但我不会单独接受解决方案。如果确实不可能,我会想出一个合理的选择。例如,我可以手动处理所有视图控制器弹出(包括默认后退按钮),从而可以从导航控制器的堆栈中获取“即将到来的控制器”。

我更喜欢使用内置API的解决方案,或者至少是我的控制器无需了解自己的导航栏状态的解决方案。

非常感谢, 帕特里克

1 个答案:

答案 0 :(得分:1)

我认为UINavigationControllerDelegate就是你所追求的。它声明了两种方法:

  • -navigationController:willShowViewController:animated:

  • -navigationController:didShowViewController:animated:

您需要做的就是将自己设置为父导航控制器的委托,并实现这些方法以通知传入的视图控制器。

话虽如此,我从来不需要借助它来隐藏和显示导航栏。严格来说,查看导航栏始终可见的控制器从不触摸导航栏的可见性。当我进入需要隐藏的视图控制器时,该视图控制器负责隐藏并将其恢复到之前的状态,然后消失。遵循这些标准对我来说已经证明是可靠的。