OC语言和Swift语言动态加载控制器->跳转

2018-01-13  本文已影响112人  ForScanf

在一般的开发过程中,跳转页面只需要初始化需要跳转的页面,随即用模态跳转或者使用导航栏跳转。

一般情况下,我们都是直接初始化相应的控制器,然后实现跳转。当如果一个页面上按钮很多,比如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)

项目命名空间中不能存在“-”字符,不然会没办法解析,无法跳转对应的类。

上一篇 下一篇

猜你喜欢

热点阅读