在項(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)求。
iOS: 由服務(wù)端控制,動(dòng)態(tài)跳轉(zhuǎn)控制器
最后編輯于 :
?著作權(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ù)。
【社區(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)容
- 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
- 本文轉(zhuǎn)載自:http://southpeak.github.io/2014/10/25/objective-c-r...
- *面試心聲:其實(shí)這些題本人都沒(méi)怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
- 焦點(diǎn)解決困體的動(dòng)力: 1、團(tuán)體維持在解決導(dǎo)向的談話,而非問(wèn)題導(dǎo)向的談話。 2、積極催化成員之間的互功,而...