需求是后台传来一个控制器的名字,然后进行跳转.
在string的分类里写的方法
/**
* @brief 将字符串转化为控制器.
*
* @param str 需要转化的字符串.
*
* @return 控制器(需判断是否为空).
*/
- (UIViewController*)stringChangeToClass:(NSString *)str {
id vc = [[NSClassFromString(str) alloc]init];
if ([vc isKindOfClass:[UIViewController class]]) {
return vc;
}
return nil;
}
注意返回的是UIViewController对象,可直接进行跳转
UIViewController* vc = [str stringChangeToClass:str];
if (vc) {
[vc setValue:@"sjssj" forKey:@"test"];
[weakSelf.navigationController pushViewController:vc animated:YES];
}
swift:
但是在Swift中由于命名空间的存在导致这样的转化,会有一定的麻烦,我们可以用下面的方法进行转化。
func getClass(stringName: String) -> Class {
//根据字符串获取对应的class,在Swift中不能直接使用
String的延展
import UIKit
extension String{
func stringChangeToVC() -> UIViewController?{
//Swift中命名空间的概念
var vc = UIViewController()
if let nameSpage = Bundle.main.infoDictionary!["CFBundleExecutable"] as? String {
if let childVcClass = NSClassFromString(nameSpage + "." + self) {
if let childVcType = childVcClass as? UIViewController.Type {
//根据类型创建对应的对象
vc = childVcType.init() as UIViewController
return vc
}
}
}
return nil
}
}
控制器中的调用
let str = "MJTableViewController"
if let vc=str.stringChangeToVC(){
self.present(vc, animated: true, completion: nil)
}
//即可跳转到叫"MJTableViewController"的控制器