Ios 如何确定何时调用了对象的方法?

Ios 如何确定何时调用了对象的方法?,ios,swift,Ios,Swift,我有一个UIViewController对象。 我想知道什么时候调用了viewDidLoad方法 我知道我可以在子类中重写此方法,并确定何时调用它 调用viewDidLoad方法时,是否还有其他方法需要知道 编辑- 我有几个视图控制器被推到UINavigationController上。 其中一些视图控制器隐藏导航栏。这可以使用给出的答案来完成 覆盖函数视图将出现(动画:Bool){ self.navigationController?.setNavigationBarHidden(真,动画:动

我有一个
UIViewController
对象。 我想知道什么时候调用了
viewDidLoad
方法

我知道我可以在子类中重写此方法,并确定何时调用它

调用
viewDidLoad
方法时,是否还有其他方法需要知道

编辑-

我有几个视图控制器被推到
UINavigationController
上。 其中一些视图控制器隐藏导航栏。这可以使用给出的答案来完成

覆盖函数视图将出现(动画:Bool){
self.navigationController?.setNavigationBarHidden(真,动画:动画)
超级。视图将显示(动画)
}
覆盖功能视图将消失(动画:Bool){
self.navigationController?.setNavigationBarHidden(错误,动画:动画)
超级。视图将消失(动画)
}
目前,我已经在许多视图控制器中重复了这段代码

我试图消除代码的重复

一种方法是创建一个包含此代码的超类,并使用视图控制器隐藏导航栏子类这个超类。但是,某些隐藏导航栏的视图控制器从
UITableViewController
UICollectionViewController
下降


我正在尝试创建一个类,该类将观察在视图控制器上调用
视图何时出现(:)
视图何时消失(:)
,然后调用该方法来隐藏和显示导航栏。

您试图实现的功能可以通过在旧的忠实的Objective-C中实现

进入您的Xcode:

  • 创建一个文件名为“Lifecycle”和文件类型为的新文件->Objective-C “类别”和“UIViewController”类

  • 如果文件不存在,Xcode将提供创建该文件的功能

  • 将新创建的文件放入桥接头中:
    #导入“UIViewController+Lifecycle.h”

  • 您的
    UIViewController+Lifecycle.h
    应该如下所示:

  • 然后,激活swizzling,比如在
    AppDelegate的
    didFinishLaunching方法中,比如:
    ViewController.setViewControllerSwizzlingActive(true)

  • 如果您想要Swift版本,这将是您的一项任务。

    您尝试过使用吗?否则,关于UIViewController的生命周期有一个很好的线索。您也说过,您可以重写该方法,然后使用断点检查何时调用它。为什么您需要知道这一点?答案可能不同。@AlekseyPotapov断点不能使用,因为它不是用于调试,而是用于在程序运行时执行操作。
    #import <UIKit/UIKit.h>
    
    @interface UIViewController (Lifecycle)
    
    + (void)setViewControllerSwizzlingActive:(BOOL)wantedState;
    
    @end
    
    #import <objc/runtime.h>
    #import "UIViewController+Lifecycle.h"
    
    @implementation UIViewController (Lifecycle)
    
    + (void)setViewControllerSwizzlingActive:(BOOL)wantedState
    {
        static BOOL isWorkaroundActive = NO;
        if (isWorkaroundActive != wantedState)
        {
            [self exchangeViewWillAppearMethod];
            [self exchangeViewWillDisappearMethod];
            isWorkaroundActive = wantedState;
        }
    }
    
    + (void)exchangeViewWillAppearMethod
    {
        Method original = class_getInstanceMethod(self, @selector(viewWillAppear:));
        Method fake = class_getInstanceMethod(self, @selector(fakeViewWillAppear:));
        method_exchangeImplementations(original, fake);
    }
    
    + (void)exchangeViewWillDisappearMethod
    {
        Method original = class_getInstanceMethod(self, @selector(viewWillDisappear:));
        Method fake = class_getInstanceMethod(self, @selector(fakeViewWillDisappear:));
        method_exchangeImplementations(original, fake);
    }
    
    - (void)fakeViewWillAppear:(BOOL *)animated
    {
        [self.navigationController setNavigationBarHidden:YES animated:animated];
        return [self fakeViewWillAppear:animated];
    }
    
    - (void)fakeViewWillDisappear:(BOOL *)animated
    {
        [self.navigationController setNavigationBarHidden:NO animated:animated];
        return [self fakeViewWillDisappear:animated];
    }
    
    @end