研究runtime一段时间后,发现runtime的运用其实很广泛。一个功能的实现也有很多种方法,主要是看我们是否会运用所掌握的知识。
以前遇到过,从服务器获取一部分数据展示一个轮播图。点击轮播图中不同的图片进入到不同的界面。像这样:
- 首先想到的写法是,根据参数写if else判断进入哪个类,然后进行创建、跳转。
- 学习runtime后,我们可以根据类名获取一个类,像这样:
Class newClass = objc_getClass(className);
那我们就可以让服务器把类名传给我们,我们直接通过类名获取到对应的类,进行跳转即可。不需要if else判断,所有的类都统一处理。
// 这个规则肯定事先跟服务端沟通好,跳转对应的界面需要对应的参数
NSDictionary *userInfo = @{
@"class": @"PushViewController",//类名
@"alertStr": @"要提示的内容"//这个类需要的参数
};
const char * className = [userInfo[@"class"] cStringUsingEncoding:NSASCIIStringEncoding];
Class newClass = objc_getClass(className);
if (!newClass) {//如果没有这个类,进行创建
Class newClass = objc_allocateClassPair([UIViewController class],className , 0);
objc_registerClassPair(newClass);
}
//传递至给newClass
id instance = [[newClass alloc] init];
[instance setValue:userInfo[@"alertStr"] forKey:@"alertStr"];
// 跳转到对应的控制器
[self.navigationController pushViewController:instance animated:YES];