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