Ios 我如何知道刚从“UINavigationViewController”推送了“UIViewController”的时间?

Ios 我如何知道刚从“UINavigationViewController”推送了“UIViewController”的时间?,ios,objective-c,Ios,Objective C,我如何知道刚刚从UINavigationViewController推送了UIViewController 我显然不想使用viewdideappear,因为每次视图出现时都会调用该方法,而不仅仅是在推送视图时 viewdiload在推送视图控制器之前被调用,我没有对navigationController的引用 您可以从导航视图控制器阵列中检查此项 有多种方法可以做到这一点: 最简单的方法。按下控制器时,在其上设置一个标志。你知道当你在推的时候,你可以在那一刻运行自定义代码 UINavigati

我如何知道刚刚从
UINavigationViewController
推送了
UIViewController

我显然不想使用
viewdideappear
,因为每次视图出现时都会调用该方法,而不仅仅是在推送视图时

viewdiload
在推送视图控制器之前被调用,我没有对navigationController的引用

您可以从导航视图控制器阵列中检查此项


有多种方法可以做到这一点:

  • 最简单的方法。按下控制器时,在其上设置一个标志。你知道当你在推的时候,你可以在那一刻运行自定义代码

  • UINavigationControllerDelegate
    及其
    navigationController:didShowViewController:animated:
    。同样,您可以将控制器设置为委托,或者仅在外部调用其上的方法

  • 控制器内部的逻辑-您可能可以使用
    viewdide
    willMoveToParentViewController:
    的组合。最初,当控制器出现时,它已被按下。之后,在侦听父控制器的更改时,当控制器从导航控制器中移除时,您可以重置“已按下”状态。您的用例不是很清楚,但在某些情况下,您可以只处理第一个
    viewdideappear
    调用,这样就可以了

  • 但是,请注意,前两个选项更容易实现。这是因为您试图从一个不应该知道该事件的类中侦听事件。
    在这种情况下,最明智的解决方案是在其他地方侦听该事件,并在外部设置控制器以处理该事件。

    您可以从
    viewdideappear
    执行此操作。从上一个VC推送时,将标志或
    bool
    状态设置为
    true
    YES
    。然后在
    viewdideappear
    中设置一个条件,即如果status或flag为true,则只执行一些您希望在推送时执行的操作。当您从另一个视图弹出到当前视图时,请将此标志或状态设置为
    NO
    ,这样,您在
    viewdide
    中的条件将不会执行。

    from除您提到的事件外,我看不到发送的其他事件。您可以使用带有布尔值的
    viewdide
    ,如图所示,查看或AlikesWillMovetoParentViewController在弹出控制器时也会被调用。@Patrick但当弹出控制器时,父参数将为
    nil
    @maddy Yes,确实如此。这在Sulthan的回答中已经讨论过。这只是一个演示,您可以根据需要使用它。首先,导航控制器必须是
    弱的
    。第二,你为什么要检查阶级平等?直接将
    lastObject
    与该控制器进行比较,但我的意思是,在刚刚添加的视图控制器的类中。(这就是我提到viewDidAppear或viewDIdLoad的原因:我显然在推式视图控制器类中)。您可以给try-to方法:viewWillLayoutSubviews,viewDidLayoutSubviews加载视图后调用的这些方法“加载视图后调用的这些方法”:这不是我所要求的。1。为什么被推送的视图控制器不应该知道何时被推送。为什么你会说“ViewDidDisplay和willMoveToParentViewController的组合”?正如@TomKnapen评论的那样,推送视图控制器时将调用MoveToParentViewController,因此解决方案3在我看来是最简单和最正确的。@Patrick,因为控制器不负责知道它是如何显示的。这是导航控制器或任何其他容器类的责任。如果不是它的责任,那么DID和willMoveToParentViewController呢?在这种情况下,责任也应该由父控制器承担,但视图控制器仍然有这些方法。@您可能会注意到,当弹出控制器时,
    willMoveToParentViewController
    将有一个不同的(
    nil
    )参数,以便它在您的情况下实际工作。
    //Eg:
    //Maintain your navigation object:
    @property (strong, nonatomic) UINavigationController *navController;
    
    //use:
       if([[self.navController.viewControllers lastObject] class] == [your view controoler class]) {
      // your view controller is present in navigation stack
    }