大概是受够了
if-else
,特意去网上找了资料,参考了很多资料,现在自己做一个总结。
/** 表驱动 */
NSArray *arr = @[
@{
//跳转类名
@"classname":@"OneViewController",
@"testIndex":[NSString stringWithFormat:@"%ld",indexPath.row],
@"name":@"这是我的名字,哈哈哈",
},
@{
//跳转类名
@"classname":@"TwoViewController",
@"index":@"bian",
},
];
NSDictionary *keyDic = arr[indexPath.row];
if (keyDic) {
[FBRuntime runtimePush:keyDic[@"classname"] dic:keyDic nav:self.navigationController];
}
看了上面的代码很简单吧,现在主要是来说说
[FBRuntime runtimePush:keyDic[@"classname"] dic:keyDic nav:self.navigationController];
如果不需要带参数的跳转,其实看前面的代码就可以,如果需要带参数,那就要考虑runtime
,自己写了一个类,现在源码贴上.
#import <Foundation/Foundation.h>
#import "AppDelegate.h"
NS_ASSUME_NONNULL_BEGIN
@interface FBRuntime : NSObject
+ (void)runtimePush:(NSString *)vcName dic:(NSDictionary *)dic nav:(UINavigationController *)nav;
+ (BOOL)checkIsExistPropertyWithInstance:(id)instance verifyPropertyName:(NSString *)verifyPropertyName;
@end
NS_ASSUME_NONNULL_END
//
// FBRuntime.m
#import "FBRuntime.h"
#import <objc/runtime.h>
#import "AppDelegate.h"
@implementation FBRuntime
//runtime跳转
+ (void)runtimePush:(NSString *)vcName dic:(NSDictionary *)dic nav:(UINavigationController *)nav {
//类名(对象名)
NSString *class = vcName;
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];
//下面是传值--------------
[dic enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
if ([self checkIsExistPropertyWithInstance:instance verifyPropertyName:key]) {
//kvc给属性赋值
[instance setValue:obj forKey:key];
}else {
NSLog(@"不包含key=%@的属性",key);
}
}];
[nav 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;
}
@end