解决方案
方案1
整个项目中建立一个基类的viewController,然后将项目中所有的viewController都继承于基类的viewController,然后重写基类中的viewWillAppear方法
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
NSString *className = NSStringFromClass([self class]);
NSLog(@"%@ will appear", className);
}
方案2
给UIViewContoller建立一个分类,在分类里进行方法的交换,既保留了原本的方法,又有打印信息
//
// UIViewController+Swizzling.m
// CollectionsOfExample
//
// Created by mac on 16/10/1.
// Copyright ? 2016年 chenfanfang. All rights reserved.
//
#import “UIViewController+Swizzling.h”
#import @implementation UIViewController (Swizzling)
-
(void)load {
//我们只有在开发的时候才需要查看哪个viewController将出现
//所以在release模式下就没必要进行方法的交换
#ifdef DEBUG//原本的viewWillAppear方法
Method viewWillAppear = class_getInstanceMethod(self, @selector(viewWillAppear:));//需要替换成 能够输出日志的viewWillAppear
Method logViewWillAppear = class_getInstanceMethod(self, @selector(logViewWillAppear:));//两方法进行交换
method_exchangeImplementations(viewWillAppear, logViewWillAppear);
#endif
}
-
(void)logViewWillAppear:(BOOL)animated {
NSString *className = NSStringFromClass([self class]);
//在这里,你可以进行过滤操作,指定哪些viewController需要打印,哪些不需要打印
if ([className hasPrefix:@“UI”] == NO) {
NSLog(@"%@ will appear",className);
}//下面方法的调用,其实是调用viewWillAppear
[self logViewWillAppear:animated];
}
@end
优缺点分析
方案1 适用于一个新项目,从零开始搭建的项目,建立一个基类controller,这种编程思想非常可取。但对于一个已经成型的项目,则方案一行不通,你总不能建议一个基类,让后将所有的controller继承的类都改成基类吧?这工程量太大,太麻烦。
方案2 不论是从零开始搭建的项目,还是已经成型的项目,方案2都适用。

本文介绍了两种在iOS项目中实现打印每个页面控制器的方法。方案一是为项目创建一个基类viewController,让所有控制器继承自它,并重写viewWillAppear方法进行日志打印。方案二是通过方法交换,在UIViewController的分类中实现日志打印,适用于已有的项目,可以在DEBUG模式下工作,减少不必要的修改。
537

被折叠的 条评论
为什么被折叠?



