iOS專案跳轉解耦實戰(一)
今天寫的這個主題分為四篇文章,今天是第一篇,我們回講解的比較簡單一些,主要看看大工程中各種各樣的跳轉模式,各個控制器傳引數。在這種情況下,就會出現你中有我,我中有你,十分臃腫,牽一髮而動全身。那麼怎麼才能夠解除這種繁重的耦合情況呢,下面看看我是怎麼做的吧!
(一)首先我們針對Present跳轉來講,我們建立一個基類控制器BSY_DecouplingControlBaseVC,在.h檔案中協商寫上這三個方法,分別是:
/**
在目標控制器初始化的時候傳入引數(可以為空)
@param parameters 引數
@return 返回初始化的自己
*/
-(id)initWithParameters:(id
/**
跳轉事件
@param classString 需要跳轉的控制器
@param object 跳轉的時候需要傳入的引數
@param completeBlock 跳轉完成的回撥
*/
-(void)bsy_JumpVC:(NSString *)classString object:(id)object animate:(BOOL)animate completeBlock:(void(^)(id completeObj))completeBlock;
/**
dissMiss事件
@param classString 需要跳轉的控制器
@param childClass 需要disMiss的控制器字典
@param object 跳轉的時候需要傳入的引數
@param completeBlock 跳轉完成的回撥
@param animate 是否需要動畫
*/
-(void)bsy_DissMissVC:(NSString *)classString childClass:(NSMutableDictionary *)childClass object:(id)object animate:(BOOL)animate completeBlock:(void(^)(id completeObj))completeBlock;
其次,我們在.m檔案中去實現方法,如下:
/**
重寫init方法
@param parameters 引數
@return 返回VC
*/
-(id)initWithParameters:(id)parameters
{
self = [super init];
if (self) {
}
returnself;
}
/**
跳轉事件
@param classString 需要跳轉的控制器
@param object 跳轉的時候需要傳入的引數
@param completeBlock 跳轉完成的回撥
*/
-(void)bsy_JumpVC:(NSString *)classString object:(id)object animate:(BOOL)animate completeBlock:(void(^)(id completeObj))completeBlock
{
if ([classString isKindOfClass:[NSString class]]) {
Class class = NSClassFromString(classString);
[selfpresentViewController:(UIViewController *)[[class alloc]initWithParameters:object] animated:animate completion:nil];
if (completeBlock) {
completeBlock(NSStringFromClass([class class]));
}
}else{
if (completeBlock) {
completeBlock(NSStringFromClass([NSError class]));
}
}
}
/**
dissMiss事件
@param classString 需要跳轉的控制器
@param object 跳轉的時候需要傳入的引數
@param completeBlock 跳轉完成的回撥
*/
-(void)bsy_DissMissVC:(NSString *)classString childClass:(NSMutableDictionary *)childClass object:(id)object animate:(BOOL)animate completeBlock:(void(^)(id completeObj))completeBlock
{
if ([classString isKindOfClass:[NSString class]]) {
Class class = NSClassFromString(classString);
UIViewController *vc = nil;
vc = [childClass objectForKey:classString];
if ([vc isKindOfClass:[class class]]) {
[vc dismissViewControllerAnimated:animate completion:nil];
if (completeBlock) {
completeBlock(NSStringFromClass([class class]));
}
}else{
if (completeBlock) {
completeBlock(NSStringFromClass([NSError class]));
}
}
}else{
if (completeBlock) {
completeBlock(NSStringFromClass([NSError class]));
}
}
}
最後,我們以BSY_DecouplingControlBaseVC為父類,建立需要的控制器,就可以實現了傳引數與跳轉,這樣就省去了每個控制器的.h檔案中各種各種的屬性定義。如下:
[selfbsy_JumpVC:NSStringFromClass([PresentControllerclass]) object:nilanimate:truecompleteBlock:^(id completeObj) {
}];
至於pushViewController跳轉也就照葫蘆畫瓢,我不多講了。這種方式有很多好處,我們傳什麼引數,直接在各自的.m檔案中獲取即刻,這樣就省去了每個控制器的.h檔案中各種各種的屬性定義,這也是解除耦合的一種方法,小工程還好,我現在在的公司做的事系統型別的iPad應用,工程檔案都是800多個檔案,如果每個控制器都是中各種各種的屬性定義,你中有我,我中有你那就沒有辦法開發了。當然這只是其中最簡單的一部分,後面三部分我會講解的更多一些。具體Demo程式碼地址:https://gitee.com/baishiyun/ios_project_jump_decoupling_real_war__1/tree/master,如果覺得不錯的請給一個星星吧!您的支援就是我前進的動力,謝謝!