iOS开发中经常会用到类似于九宫格那样的布局,点击布局中的item要跳转到对应的界面去,就类似于这种
九宫格布局 tableViewCell跳转.png
点击每一个item跳转的界面都不一样,按照我们一般的写法我们首先要把每一个将要跳转的
ViewController
的头文件导入到该控制器中,然后在
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
方法中根据indexPath.row
去判断点击的哪一个item,然后再生成对应的ViewController
,再执行push操作,这样不仅会因为导入大量的头文件而导致这个界面编译速度变慢,其次如果九宫格内的布局发生改变(界面的排列顺序改变、根据服务器返回的对应的隐藏某些item、某个viewController
的名字改变),那么你还需要一个个的再去判断indexPath.row
来生成对应的ViewController
然后再去push,这样也太麻烦了,所以我们可以对此稍微的改变一下。
首先我们要利用的就是类的反射机制,就是可以通过字符串去生成对应的class,就类似于这样
SEL selector = NSSelectorFromString(selectorName)
亦或者这样
UIViewController *VC = [NSClassFromString(viewControllerId) new];
是不是发现爽歪歪,这样就不用一个个的去导入对应的头文件了,而是直接通过vcName
去生成对应的viewController
,岂不美哉?
But,类的反射机制大家也看到了,它只能生成对应的VC对象,但是我们的界面不可能全部都是不需要传入任何参数的,他们有可能会是这样
像这种界面我们怎么在不引用他们头文件的话去给属性赋值呢,这就需要请出我们今天的主角
KVC
和runtime
了,这种情况对于它们来说可是小case呦。runtime
可以帮助我们获取到这个类的所有你想要的(属性,方法,代理)而
KVC
可以帮我们直接赋值,是不是很方便?KVC赋值 runtime获取所有属性
这样我们就可以在不导入这个
ViewController
头文件的情况下来生成这个VC的实例对象,从而执行push操作了,当然了为了方便使用,小编对其进行了一点简易的封装manager头文件
manager.m 这里是我们的使用方法
dataSource赋值 使用方法
虽然代码写的很垃圾,但是用起来个人感觉还是有一点点方便的,起码这样类中就再也不用把所有用到的
viewController
的头文件导入,也不用发愁当九宫格内的布局发生改变时而去一个个的调整didSelectRowAtIndexPath
方法了,岂不是有点小爽吗?最后再贴上Demo的地址:万能跳转Demo
网友评论