logging项目中所有UIViewController的类名

我们收到了一个来自外包的巨大项目,我们正试图“修复”。 项目中有数百个视图控制器。 我们的目标是轻松确定我们目前正在设备上查看哪个课程。

我们的解决scheme(这不起作用,因此是SO问题)。

用下面的代码覆盖UIViewController的viewDidAppear方法:

-(void)viewDidAppear:(BOOL)animated { NSLog(@"Current View Class: %@", NSStringFromClass(self.class)); [self viewDidAppear:animated]; //Also tried this: //[super viewDidAppear:animated]; } 

这个类将放在项目的.pch中。

这将不需要在数百个视图控制器中放置额外的代码,并且可以轻松打开和closures。 这不起作用,因为,正如我们现在所知道的,< meme >不会简单地通过类别< / meme >覆盖现有的方法。

我们缺less什么?

答案是调整方法! 这是我们想到的:

 #import "UIViewController+Logging.h" #import <objc/runtime.h> @implementation UIViewController (Logging) -(void)swizzled_viewDidAppear:(BOOL)animated { NSLog(@"Current View Class: %@", NSStringFromClass(self.class)); [self swizzled_viewDidAppear:animated]; } + (void)load { Method original, swizzled; original = class_getInstanceMethod(self, @selector(viewDidAppear:)); swizzled = class_getInstanceMethod(self, @selector(swizzled_viewDidAppear:)); method_exchangeImplementations(original, swizzled); } @end 

这是解决scheme

在你的.pch文件中包含这个

 #define UIViewController MyViewController #import "MyViewController.h" 

创build你的新的UIViewController子类

.h文件

 #import <UIKit/UIKit.h> #ifdef UIViewController #undef UIViewController #endif @interface MyViewController : UIViewController @end #ifndef UIViewController #define UIViewController MyViewController #endif 

和.m文件

 #import "MyViewController.h" @implementation MyViewController - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"Current View Class: %@", NSStringFromClass(self.class)); } @end 

视图控制器是否共享一个共同的基类? 如果是这样的话,你可以把它放在基类的[viewDidAppear:]的实现中。 如果他们没有共同的基础,那么也许这将是一个有价值的任务,因为它可能是有用的(通用分析代码等)

你可以做一个应用程序范围的查找和replace从Xcode,但它不一定会find每个案件(但也不会尝试的方法)。 您可以查找“[super viewDidLoad]”; 并用“[super viewDidLoad]; NSLog(@”Current View Class:%@“,NSStringFromClass(s​​elf.class));”

该应用程序是否使用导航控制器来显示视图控制器? 如果是这样,您可以使用NavigationController的方法来报告当前的控制器:

  - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated { [self reportNewController:viewController]; } - (void) reportNewController:(UIViewController *)viewController { NSString *name = viewController.title; NSLog(@"Name is %@",name); } 

你可以使用方法swizzling。 这是一个很好的指导: http : //nshipster.com/method-swizzling/