1. 程式人生 > >iOS專案跳轉解耦實戰(一)

iOS專案跳轉解耦實戰(一)

今天寫的這個主題分為四篇文章,今天是第一篇,我們回講解的比較簡單一些,主要看看大工程中各種各樣的跳轉模式,各個控制器傳引數。在這種情況下,就會出現你中有我,我中有你,十分臃腫,牽一髮而動全身。那麼怎麼才能夠解除這種繁重的耦合情況呢,下面看看我是怎麼做的吧!

(一)首先我們針對Present跳轉來講,我們建立一個基類控制器BSY_DecouplingControlBaseVC,在.h檔案中協商寫上這三個方法,分別是:

/**

 在目標控制器初始化的時候傳入引數(可以為空)

 @param parameters 引數

 @return 返回初始化的自己

 */

-(id)initWithParameters:(id

)parameters;

/**

 跳轉事件

 @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,如果覺得不錯的請給一個星星吧!您的支援就是我前進的動力,謝謝!