在一般的开发过程中,跳转页面只需要初始化需要跳转的页面,随即用模态跳转或者使用导航栏跳转。
一般情况下,我们都是直接初始化相应的控制器,然后实现跳转。当如果一个页面上按钮很多,比如tableview上每个row跳转的页面都不一样,这种方式就比较繁琐了。
OC
OneViewController *vc = [[OneViewController alloc]init];
self.navigationController pushViewController:vc animated:YES];
Swift
let vc = OneViewController()
self.navigationController?.pushViewController(vc, animated: true)
有时候我们在同一个页面上添加了很多的按钮,每个按钮跳转的类都不一样,这时候我们就需要动态加载控制器,可以将这些控制器的类名放进数组里。(注:这种方式是不能传递参数的)
OC
NSMutableArray *MainBusinessArr = [NSMutableArray array];
[MainBusinessArr addObject:@{@"title":@"业务联系人",@"icon":@"联系人",@"viewController":@"Business_contacts_ListViewController"}];
NSString *ControllerStr = [[MainBusinessArr objectAtIndex:indexPath.row] objectForKey:@"viewController"];
UIViewController* viewController = [[NSClassFromString(ControllerStr) alloc] init];
[self.navigationController pushViewController:viewController animated:YES];
Swift
var ListArr:NSMutableArray = []
ListArr.add(["name":"添加联系人","image":"bm_addclient","viewController":"ContactAddViewController"])
let dic:[String:String] = ListArr.object(at: indexPath.row) as! [String:String]
// 获取跳转的类名
let targetVC:String = dic["viewController"]!
//获取命名空间
var NameSpace = Bundle.main.infoDictionary!["CFBundleExecutable"]as? String
// 将Bunldle Identifier中的“-”改成“_”
NameSpace = NameSpace?.replacingOccurrences(of: "-", with: "_")
let clsName = NameSpace! + "." + targetVC
let model = NSClassFromString(clsName) as! UIViewController.Type
let vc = model.init()
self.navigationController?.pushViewController(vc, animated: true)
项目命名空间中不能存在“-”字符,不然会没办法解析,无法跳转对应的类。