iOS: 由服務(wù)端控制,動(dòng)態(tài)跳轉(zhuǎn)控制器

  • 在項(xiàng)目中,我們可能碰到這樣的情況,產(chǎn)品想要一個(gè)靈活的入口。比如首頁(yè)的輪播banner、商品中間穿插的banner等等。這些入口可能跳轉(zhuǎn)詳情頁(yè),也可能是web頁(yè),也可能是分類頁(yè)。那么怎么實(shí)現(xiàn)讓后臺(tái)服務(wù)器來(lái)控制客戶端跳轉(zhuǎn)呢?

  • 首先跟后臺(tái)約定好,增加兩個(gè)字段:template、paramete。一個(gè)用來(lái)創(chuàng)建控制器,一個(gè)是創(chuàng)建好的控制器里請(qǐng)求的參數(shù),然后給所有想支持動(dòng)態(tài)跳轉(zhuǎn)的控制器起好名字,例如詳情頁(yè)叫XXX_Detail。

  • 當(dāng)我們收到服務(wù)器傳來(lái)的template和paramete時(shí),我們根據(jù)template的值:XXX_Detail,去尋找與其對(duì)應(yīng)的控制器名字XXX_DetailController。 (這里不推薦讓后臺(tái)直接傳遞控制器名字,因?yàn)殡S著工程越來(lái)越大,控制器越來(lái)越多,可能會(huì)覺(jué)得原來(lái)的控制器名字起得不好或新加的控制器更適合那個(gè)名字而發(fā)生更改)
    - (id)viewControllerGenericFromScheme:(NSString ) className {
    const char * _classNameCString = [className cStringUsingEncoding:NSASCIIStringEncoding];
    /
    * 使用字符串獲取一個(gè)類 /
    Class _controllerClass= objc_getClass(_classNameCString);
    if (newClass==nil) {
    Class superClass = [NSObject class];
    _controllerClass = objc_allocateClassPair(superClass, classNameCString, 0);
    objc_registerClassPair(_controllerClass);
    }
    /
    * 創(chuàng)建實(shí)例對(duì)象 /
    id instance = [[_controllerClass alloc] init];
    ((UIViewController )instance).hidesBottomBarWhenPushed = YES;
    /
    屬性自動(dòng)賦值 /
    [self autoSetInstanceProperty:instance];
    return instance;
    }
    - (void)autoSetInstanceProperty:(id)instance{
    NSString * _paramete = [self parametePropertyValue];
    [instance setValue: _paramete forKey:@"paramete"];
    /
    * 多個(gè)參數(shù)可以仿照此參數(shù)繼續(xù)賦值 */
    }
    - (NSString *) parametePropertyValue {
    unsigned int outCount, i;
    objc_property_t *properties = class_copyPropertyList([self class], &outCount);
    for (i=0; i<outCount; i++) {
    objc_property_t property = properties[i];
    NSString * key = [[NSString alloc]initWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
    id propertyValue = [self valueForKey:key];
    if ([key isEqualToString:@"paramete"]) {
    if (![CLCommonFunction isBlankString:propertyValue]) {
    return propertyValue;
    } else {
    return nil;
    }
    }
    }
    return nil;
    }
    這樣,只要在外面使用模型傳入控制名字就可以返回一個(gè)控制器的實(shí)例對(duì)象。
    UIViewController *createVc = [model viewControllerGenericFromScheme:className];
    有了控制器實(shí)例對(duì)象,然后跳轉(zhuǎn)過(guò)去就可以了,此方法也可用于收到推送后的處理,只要將template、paramete攜帶在推送里,就可以跳到指定頁(yè)面,并用paramete進(jìn)行請(qǐng)求。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容