1. 程式人生 > >iOS 程式碼解耦利器(一)

iOS 程式碼解耦利器(一)

最近寫demo的過程中需要通過tableView的cell跳轉到多個頁面,當時偷懶不想去引用標頭檔案了,靈光一閃,寫了一個跳轉的方法,後來自己有完善了一下,基本滿足了不帶引數的頁面跳轉,帶引數的頁面跳轉(使用者自定義的物件也是可以的)。
下面就給大家簡單的講一下用的主要知識點

1, NSClassFromString 通過類名的字串獲取類

UIViewController *vc = [[NSClassFromString(VCName) alloc] init];

不帶引數的跳轉我們可以這樣實現:

+ (void)navigationController:(UINavigationController
*)naVC pushToSpecifiedVC:(NSString *)VCName { UIViewController *vc = [[NSClassFromString(VCName) alloc] init]; [naVC pushViewController:vc animated:YES]; }

跳轉的時候我們直接呼叫:

[VCJumpManager navigationController:self.navigationController pushToSpecifiedVC:@"VC1"];

2,如果需要在頁面跳轉的時候傳遞引數,那麼必須做到能夠為VC物件的property正確賦值。
賦值的方法實現如下:

+ (id)object:(id)object setPropertyValues:(NSDictionary *)param {

    if (param && [param isKindOfClass:[NSDictionary class]]) {
        unsigned int outCount, i;
        objc_property_t *properties = class_copyPropertyList([object class], &outCount);
        for (i = 0; i < outCount; i++){
            objc_property_t property = properties[i];
            const
char *char_f = property_getName(property); NSString *propertyName = [NSString stringWithUTF8String:char_f]; id propertyValue = [param valueForKey:(NSString *)propertyName]; if ([CommonTools judgeObjValue:propertyValue]){ //快取單例項到記憶體 [object setValue:propertyValue forKey:propertyName]; } } free(properties); } return object; }

具體呼叫如下:


        [VCJumpManager navigationController:self.navigationController pushToSpecifiedVC:@"VC2" parameter:@{@"testStr":@"hi jack!",@"testArray":@[@"123",@"hi lisa!"],@"testDic":@{@"name":@"jack"}}];

當然瞭如果VC物件的property是使用者自定義的物件,那麼我們用上面這個方法來對使用者自定義物件進行賦值。然後傳入。
直接呼叫程式碼如下:

id dog = [NSClassFromString(@"Dog") new];
        [VCJumpManager object:dog setPropertyValues:@{@"name":@"雞仔",@"height":@(0.5)}];
    [VCJumpManager navigationController:self.navigationController pushToSpecifiedVC:@"VC3" parameter:@{@"dog":dog}];

這種思路可以在一定程度上減少標頭檔案的引用,減少直接引用造成的耦合,對於專案後期的元件化有很多的幫助。
demo下載地址