對于一個大項目而言,最煩惱的就是在眾多界面難以找到對應的viewController,要改個東西都要花好長的時間去找對應的類。特別是當你接手一個大項目的時候,對整體的業務邏輯不熟悉,整體的架構體系不熟悉,讓你修復某個頁面的BUG,估計你找這個頁面所對應的viewController都要找好久。
有一種比較簡單的方法可以實現這個功能,在很多時候我們的ViewController中都有Hud顯示和alertView顯示的情況,我們就可以簡歷一個基類控制器ViewController,把多數頁面都會用到的東西放在里面,所以說如何解決項目中的業務邏輯熟悉,就可以通過在基類里面重寫viewWillAppear方法達到。第二種就是通過運行時交換ViewWillAPPear方法。
第一種方法適合剛開始的項目使用,第二種則是那個階段都可以使用的。
一、第一種方案
-?(void)viewWillAppear:(BOOL)animated?{
[super?viewWillAppear:animated];
NSString?*controllerName?=?NSStringFromClass([self?class]);
NSLog(@"%@?is currentController",?controllerName?);
}
二、第二種方案
給UIViewContoller建立一個類別category,在category里進行方法的交換,既保留了原本的方法,又有打印信息
#import?"UIViewController+LoadPage.h"
#import?@implementation?UIViewController?(LoadPage)
+?(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?*controllerName?=?NSStringFromClass([self?class]);
//在這里,你可以進行過濾操作,指定哪些viewController需要打印,哪些不需要打印
if?([className?hasPrefix:@"UI"]?==?NO)?{
NSLog(@"%@?is currentViewController",controllerName?);
}
//下面方法的調用,其實是調用viewWillAppear
[self?logViewWillAppear:animated];
}