萬能跳轉(zhuǎn)界面方法

http://www.itdecent.cn/p/8b3a9155468d

在開發(fā)項目中,會有這樣變態(tài)的需求:

  • 推送:根據(jù)服務(wù)端推送過來的數(shù)據(jù)規(guī)則,跳轉(zhuǎn)到對應(yīng)的控制器
  • feeds列表:不同類似的cell,可能跳轉(zhuǎn)不同的控制器(噓!產(chǎn)品經(jīng)理是這樣要求:我也不確定會跳轉(zhuǎn)哪個界面哦,可能是這個又可能是那個,能給我做靈活嗎?根據(jù)后臺返回規(guī)則任意跳轉(zhuǎn)?)

思考:wocao!這變態(tài)的需求,要拒絕他嗎?
switch判斷唄,考慮所有跳轉(zhuǎn)的因素?這不得寫死我...

switch () {
    case :
        break;
    default:
        break;
}

我是這么個實現(xiàn)的(runtime是個好東西)

利用runtime動態(tài)生成對象、屬性、方法這特性,我們可以先跟服務(wù)端商量好,定義跳轉(zhuǎn)規(guī)則,比如要跳轉(zhuǎn)到A控制器,需要傳屬性id、type,那么服務(wù)端返回字典給我,里面有控制器名,兩個屬性名跟屬性值,客戶端就可以根據(jù)控制器名生成對象,再用kvc給對象賦值,這樣就搞定了 ---O(∩_∩)O哈哈哈

比如:根據(jù)推送規(guī)則跳轉(zhuǎn)對應(yīng)界面HSFeedsViewController

HSFeedsViewController.h

  • 進入該界面需要傳的屬性
@interface HSFeedsViewController : UIViewController

// 注:根據(jù)下面的兩個屬性,可以從服務(wù)器獲取對應(yīng)的頻道列表數(shù)據(jù)

/** 頻道ID */
@property (nonatomic, copy) NSString *ID;

/** 頻道type */
@property (nonatomic, copy) NSString *type;

@end

AppDelegate.m

  • 推送過來的消息規(guī)則
// 這個規(guī)則肯定事先跟服務(wù)端溝通好,跳轉(zhuǎn)對應(yīng)的界面需要對應(yīng)的參數(shù)
NSDictionary *userInfo = @{
                           @"class": @"HSFeedsViewController",
                           @"property": @{
                                        @"ID": @"123",
                                        @"type": @"12"
                                   }
                           };

  • 接收推送消息
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    [self push:userInfo];
}

  • 跳轉(zhuǎn)界面
- (void)push:(NSDictionary *)params
{
    // 類名
    NSString *class =[NSString stringWithFormat:@"%@", params[@"class"]];
    const char *className = [class cStringUsingEncoding:NSASCIIStringEncoding];

    // 從一個字串返回一個類
    Class newClass = objc_getClass(className);
    if (!newClass)
    {
        // 創(chuàng)建一個類
        Class superClass = [NSObject class];
        newClass = objc_allocateClassPair(superClass, className, 0);
        // 注冊你創(chuàng)建的這個類
        objc_registerClassPair(newClass);
    }
    // 創(chuàng)建對象
    id instance = [[newClass alloc] init];

    // 對該對象賦值屬性
    NSDictionary * propertys = params[@"property"];
    [propertys enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        // 檢測這個對象是否存在該屬性
        if ([self checkIsExistPropertyWithInstance:instance verifyPropertyName:key]) {
            // 利用kvc賦值
            [instance setValue:obj forKey:key];
        }
    }];

    // 獲取導(dǎo)航控制器
    UITabBarController *tabVC = (UITabBarController *)self.window.rootViewController;
    UINavigationController *pushClassStance = (UINavigationController *)tabVC.viewControllers[tabVC.selectedIndex];
    // 跳轉(zhuǎn)到對應(yīng)的控制器
    [pushClassStance pushViewController:instance animated:YES];
}

  • 檢測對象是否存在該屬性
- (BOOL)checkIsExistPropertyWithInstance:(id)instance verifyPropertyName:(NSString *)verifyPropertyName
{
    unsigned int outCount, i;

    // 獲取對象里的屬性列表
    objc_property_t * properties = class_copyPropertyList([instance
                                                           class], &outCount);

    for (i = 0; i < outCount; i++) {
        objc_property_t property =properties[i];
        //  屬性名轉(zhuǎn)成字符串
        NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
        // 判斷該屬性是否存在
        if ([propertyName isEqualToString:verifyPropertyName]) {
            free(properties);
            return YES;
        }
    }
    free(properties);

    return NO;
}

具體使用和代碼: https://github.com/HHuiHao/Universal-Jump-ViewController

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

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

  • 在開發(fā)項目中,會有這樣變態(tài)的需求: 推送:根據(jù)服務(wù)端推送過來的數(shù)據(jù)規(guī)則,跳轉(zhuǎn)到對應(yīng)的控制器 feeds列表:不同類...
    漢斯哈哈哈閱讀 31,617評論 110 502
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 30,229評論 8 265
  • 今天聽錦明老師講的這個內(nèi)容,記錄下我的所思,孩子是助我們成長的,是我們的天使,父母就要來修煉自己,我個人理解的沉的...
    愛君2005閱讀 214評論 0 1
  • 看,我都這么丑了,還堅強的活著,多好??!告訴我吧
    王賤賤述閱讀 151評論 12 0
  • 嗨 最近過的好嗎 很俗氣的開場白是吧,我也覺得,但意外發(fā)現(xiàn)確實還蠻好用的。 你看,夏天又要來了,這幾天天氣反反復(fù)復(fù)...
    大餅愛吃餅閱讀 234評論 0 0

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