`

[转]iOS 万能跳转界面方法 (runtime实用篇一)

    博客分类:
  • ios
 
阅读更多
在开发项目中,会有这样变态的需求:

推送:根据服务端推送过来的数据规则,跳转到对应的控制器
feeds列表:不同类似的cell,可能跳转不同的控制器(嘘!产品经理是这样要求:我也不确定会跳转哪个界面哦,可能是这个又可能是那个,能给我做灵活吗?根据后台返回规则任意跳转?)
思考:wocao!这变态的需求,要拒绝他吗?

switch判断呗,考虑所有跳转的因素?这不得写死我...
switch () {
    case :
        break;
    default:
        break;
}

我是这么个实现的(runtime是个好东西)

利用runtime动态生成对象、属性、方法这特性,我们可以先跟服务端商量好,定义跳转规则,比如要跳转到A控制器,需要传属性id、type,那么服务端返回字典给我,里面有控制器名,两个属性名跟属性值,客户端就可以根据控制器名生成对象,再用kvc给对象赋值,这样就搞定了 ---O(∩_∩)O哈哈哈

比如:根据推送规则跳转对应界面HSFeedsViewController

HSFeedsViewController.h:

进入该界面需要传的属性
@interface HSFeedsViewController : UIViewController
// 注:根据下面的两个属性,可以从服务器获取对应的频道列表数据
/** 频道ID */
@property (nonatomic, copy) NSString *ID;
/** 频道type */
@property (nonatomic, copy) NSString *type;
@end

AppDelegate.m:

//推送过来的消息规则

// 这个规则肯定事先跟服务端沟通好,跳转对应的界面需要对应的参数
NSDictionary *userInfo = @{
                           @"class": @"HSFeedsViewController",
                           @"property": @{
                                        @"ID": @"123",
                                        @"type": @"12"
                                   }
                           };
//接收推送消息

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    [self push:userInfo];
}
//跳转界面
- (void)push:(NSDictionary *)params
{
    // 类名
    NSString *class =[NSString stringWithFormat:@"%@", params[@"class"]];
    const char *className = [class cStringUsingEncoding:NSASCIIStringEncoding];
    // 从一个字串返回一个类
    Class newClass = objc_getClass(className);
    if (!newClass)
    {
        // 创建一个类
        Class superClass = [NSObject class];
        newClass = objc_allocateClassPair(superClass, className, 0);
        // 注册你创建的这个类
        objc_registerClassPair(newClass);
    }
    // 创建对象
    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];
        }
    }];
    // 获取导航控制器
    UITabBarController *tabVC = (UITabBarController *)self.window.rootViewController;
    UINavigationController *pushClassStance = (UINavigationController *)tabVC.viewControllers[tabVC.selectedIndex];
    // 跳转到对应的控制器
    [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];
        //  属性名转成字符串
        NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
        // 判断该属性是否存在
        if ([propertyName isEqualToString:verifyPropertyName]) {
            free(properties);
            return YES;
        }
    }
    free(properties);
    return NO;
}
分享到:
评论

相关推荐

    ios实现跳转管理

    在iOS开发中,实现“跳转管理”是一个关键任务,特别是在设计复杂的应用程序流程时。本文将基于给定的博客链接...通过学习和实践,开发者可以构建出一个高效且易用的万能跳转框架,服务于自己的iOS应用。

    IOS界面跳转传值

    详细的IOS界面跳转及传值,包含toolbar实现多个view之间的跳转以及界面内按钮实现跳转,用到单例模式: 在第一个界面登陆,在第二个界面显示名字,并且根据不同的名字显示不同的图片 (最好不要加toolbar) 博客参考...

    iOS runtime实用篇:让你快速上手一个项目 - CocoaChina_让移动开发更简单1

    这篇关于iOS Runtime的文章主要面向移动开发者,尤其是那些希望通过深入理解Runtime来提升iOS应用开发技能的人员。 首先,iOS Runtime允许我们进行消息传递(Message Dispatching),这是Objective-C编程中的关键...

    ios页面跳转传值

    本文将详细讲解“ios页面跳转传值”这一主题,以及如何使用`delegate`来隐藏键盘。 首先,让我们理解页面跳转的概念。在iOS应用中,我们通常使用`UIStoryboardSegue`或`UINavigationController`进行页面之间的切换...

    iOS开发Runtime的用法

    在iOS开发中,Runtime是一种强大的工具,它允许我们在运行时检查和修改应用程序的行为。Runtime,全称为Objective-C Runtime,是Objective-C语言的核心组成部分,它在程序执行过程中提供了对类、对象、方法等元数据...

    ios runtime动态添加方法demo

    本文将深入探讨“ios runtime动态添加方法demo”这一主题,通过一个简单的示例项目RuntimeDemo来阐述Runtime的核心概念和应用。 Runtime,全称为Objective-C Runtime,是Apple的Objective-C编程语言的一个关键组成...

    ios页面跳转

    在iOS应用开发中,页面跳转是用户交互的重要组成部分,它涉及到用户界面的导航和流程控制。本示例主要探讨了三种iOS页面跳转的方法:通过Storyboard进行导航、使用NavigationController以及视图转换(ViewTransition...

    ios protocol 界面跳转demo

    本教程将通过一个界面跳转的Demo,深入讲解如何使用协议进行界面间的交互。我们将主要关注以下几个方面: 1. **协议的概念与声明** 协议在Objective-C和Swift中都是定义行为的标准,它定义了一组方法和属性,但不...

    ios-对runtime的练习,对页面的统计.zip

    在iOS开发中,Runtime是一个非常重要的概念,它是一种运行时环境,允许我们在程序运行时动态地获取和修改对象的信息,包括方法、属性和关联。Runtime是Objective-C和Swift中的一个核心特性,它使得编程变得更加灵活...

    ios5拨号界面原版本

    本篇文章将详细探讨iOS 5的拨号界面及其特点,并提供如何将iOS 6的拨号界面恢复为iOS 5样式的方法。 iOS 5的拨号界面是苹果在2011年推出的一个重要更新,它引入了许多新的功能和改进。这个界面以其简洁、直观的设计...

    IOS数据存储 FMDB + runtime

    Objective-C的runtime是一个强大的底层API,它允许在运行时动态地获取类的信息、修改方法、添加属性等。在数据库操作中,runtime可以用于自动管理对象与数据库之间的映射,减轻手动写SQL语句的负担。例如,我们可以...

    总结iOS中runtime的使用

    iOS中的Runtime是一个强大的工具,它是Objective-C运行时系统的简称,主要负责在程序运行时处理对象、类、协议等的各种操作。Objective-C与静态类型语言如C不同,它采用动态调用过程,即在编译时不会确定具体调用...

    iOSAPP跳转微信小程序Demo

    iOSAPP跳转微信小程序的Demo,仅用于演示作用,集成细节在博客中有详细介绍,可移驾这里:https://blog.csdn.net/fuzheng0301/article/details/100036332

    iOS和Android用同一个二维码实现跳转下载链接的方法

    最近一个项目需要iOS和安卓使用一个二维码,让扫描的机器自己识别操作系统实现跳转到相应的下载链接。比如iPhone用微信进行扫描就让他跳转appStore的下载页面,安卓机器使用微信扫描就直接跳浏览器下载。但是这...

    iOS页面跳转动画

    iOS页面跳转的各式动画,比较全面; UIView animateWithDuration:DURATION animations:^{ [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; [UIView setAnimationTransition:transition forView:view ...

    总结IOS界面间跳转的几种方法

    本文将详细介绍五种在iOS中实现界面跳转的方法,并分析它们的优缺点。 1. **Storyboard Segues** 故事板(Storyboard)的Segues是iOS开发中最直观的方式。通过在Interface Builder中从一个视图控制器(如...

    iOS 实现页面跳转

    在iOS开发中,页面跳转是应用程序中不可或缺的一部分,它允许用户在不同的视图和控制器之间导航。本教程将深入探讨如何在iOS中实现页面跳转,特别关注新手开发者的需求。我们将讨论两种主要的页面跳转方式:模态...

    Runtime 万能控制器跳转.zip

    在iOS开发中,"Runtime" 是一个至关重要的概念,它是指Objective-C(简称OC)运行时系统,是苹果为其面向对象编程语言Objective-C提供的一种机制。Runtime系统在程序运行过程中动态解析类、方法等信息,使得OC具有了...

    仿IOS的PreferenceActivity界面

    9. **微博素材和博客文章**:提到的博客文章提供了具体实现这种仿iOS界面的步骤和代码示例,开发者可以通过阅读这篇博客来学习和参考。同时,微博上的素材可能包含了一些界面设计的灵感和图片资源,可以帮助开发者更...

    ios7信息界面

    ios7信息界面

Global site tag (gtag.js) - Google Analytics