【问题标题】:UIViewController: detecting drill-down and drill-upUIViewController:检测向下钻取和向上钻取
【发布时间】:2009-07-02 12:44:22
【问题描述】:

有没有办法让 UIViewController(在导航堆栈内)检测它是否因为执行了向下钻取或向上钻取而出现?

不幸的是,在 viewWillAppear 中,UINavigationController 的 topViewController 和 visibleViewController 已经设置为新的 ViewController。

【问题讨论】:

  • 我也一直在为此苦苦挣扎。我曾希望创建一个辅助类并将其设为我的“堆栈”UINavigationControllerDelegate,然后通过“navigationController:willShowViewController:”查看,但有两个问题:1) 似乎即使在没有被推送时也被调用(例如在该堆栈上切换- 这看起来很可疑)和 2)这在相关控制器的 viewWillAppear 之后被调用,这给我带来了逻辑问题,因为我需要在视图出现之前知道我是否在同一个堆栈中。我只是指出这一点,因为这种方法看起来很优雅,但却是死路一条。

标签: iphone uiviewcontroller uinavigationcontroller


【解决方案1】:

您可以继承 UINavigationController,并添加一个属性didPushViewController。然后您可以覆盖pushViewControllerpopViewController 以分别正确地将属性设置为true 或false。

【讨论】:

  • 听起来不错。我只是认为有一种更简单的方法我忽略了。谢谢。
【解决方案2】:

另一种方法是将您正在向下钻取的任何视图控制器作为类局部变量存储 - 然后在 viewWillAppear 中,如果仍然设置了任何类局部变量,您就会知道您因为向上钻取而受到打击。您甚至可以知道用户从哪个控制器返回,因此您可以执行不同的逻辑(例如从您深入到的视图控制器中获取更改的值)。

不要忘记释放并清除 viewWillAppear 中的引用,以便系统重置以再次正确识别事物。

我更喜欢这种机制,而不是让下钻控制器知道主视图作为推送更改的委托,因为他们经常处理一些单独的小数据,不必了解整个数据主视图控制器。这也使它们更易于重用,因为它们可以被许多不同的类调用。

【讨论】:

    【解决方案3】:

    您是否只需要知道上一个和下一个视图控制器是什么?或者您是否需要特别知道视图控制器是弹出还是推送?可以实现如下方法,由UINavigationControllerDelegate定义:

    - ( void )navigationController:( UINavigationController * )navigationController willShowViewController:( UIViewController * )viewController animated:( BOOL )animated
    {
        UIViewController * currentController = navigationController.visibleViewController;
        UIViewController * nextController = viewController;
    
        // Do whatever here.
    }
    

    但是,如果您确实需要知道某个特定的视图控制器是被弹出还是被推送,那么 Matt Bridges 的建议就是要走的路。

    【讨论】:

      【解决方案4】:

      你不能看看导航控制器中的 viewControllers 属性吗?

      【讨论】:

      • 恐怕不是。当前视图控制器将始终是数组中的最后一项。无法检测到这是由于自身被推动还是另一个控制器被弹出而发生的。 :(
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多