是否有办法让UIViewController(在导航堆栈内)检测是否因为执行了向下钻取或向下钻取而出现?
在viewWillAppear中,不幸的是,UINavigationController的topViewController和visibleViewController已经设置为新的ViewController。
答案 0 :(得分:5)
您可以继承UINavigationController,并添加属性didPushViewController
。然后,您可以覆盖pushViewController
和popViewController
,以便将属性分别正确设置为true或false。
答案 1 :(得分:2)
另一种方法是将您正在深入挖掘的任何视图控制器存储为类本地变量 - 然后在viewWillAppear中,如果仍然设置了任何类局部变量,则您知道由于钻取而被击中。您甚至知道用户返回的控制器,因此您可以执行不同的逻辑(例如从您钻取的视图控制器中获取更改的值)。
不要忘记释放并取消viewWillAppear中的引用,以便重置系统以再次正确识别事物。
我喜欢这种机制,而不是让深入控制器知道主视图作为推送更改的委托,因为他们经常处理一些单独的小数据,不应该知道整个主视图控制器。它使得它们更容易重用,因为它们可以被许多不同的类调用。
答案 2 :(得分:1)
您只需要知道上一个和下一个视图控制器是什么吗?或者您是否需要具体了解视图控制器是弹出还是推动?您可以实现以下方法,该方法由UINavigationControllerDelegate
:
- ( void )navigationController:( UINavigationController * )navigationController willShowViewController:( UIViewController * )viewController animated:( BOOL )animated
{
UIViewController * currentController = navigationController.visibleViewController;
UIViewController * nextController = viewController;
// Do whatever here.
}
但是,如果您需要知道特定的视图控制器是弹出还是推动,那么马特布里奇斯的建议是可行的。
答案 3 :(得分:0)
你不能看一下导航控制器中的viewControllers属性吗?