
對於一個大項目而言,最煩惱的就是在眾多界面難以找到對應的viewController,要改個東西都要花好長的時間去找對應的類。
特別是當你接手一個大項目的時候,對整體的業務邏輯不熟悉,整體的架構體系不熟悉,讓你修復某個頁面的BUG,估計你找這個頁面所對應的viewController都要找好久。
能否有一種方式可以快速讓你上手一個大項目?快速找到某個頁面所對應的viewController ?
在每一個頁面出現的時候,都打印出哪個類即將出現,如下圖所示

方案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都適用。