从字符串(视图控制器字符串名称)创建一个UIViewController类实例,而不使用Storyboard或NIB/XIB?

从字符串(视图控制器字符串名称)创建一个UIViewController类实例,而不使用Storyboard或NIB/XIB?

问题描述:

我想从推送通知实例化视图控制器,大多数教程似乎建议传递VC的标识符并将它们与storyboardID进行匹配。从字符串(视图控制器字符串名称)创建一个UIViewController类实例,而不使用Storyboard或NIB/XIB?

问题是我的应用程序是编程方式,所以我不能添加故事板标识符。

我该如何解决这个编程,所以我可以通过一个字符串引用VC?

更新:
我的观点是,如果通知解析一个字符串的VC实例化例如“仪表板”,然后我不能通过匹配该字符串的标识符加载,ID需要一个大规模的switch语句,然后在每种情况下运行您的代码

+0

你有故事板为您的视图控制器设计(无赛格瑞连接)? – Krunal

+0

没有它的所有程序 – jackdm

+0

“所以我可以引用一个VC”,你是如何初始化它?您不必使用storyboardID,您可以执行'MyVCForPush * vc = [[MyVCForPush alloc] init]'; 'MyVCForPush * vc = [[MyVCForPush alloc] initWithXibName:@someName]',然后'[vc setPushInfo:myPushInfo]',然后显示它。 – Larme

当视图控制器不与storybaord或nib文件关联时,它是类的)默认的引发器提供了一个视图控制器的实例。

试试这个,请参见:

Objective-C的

ViewController *viewController = [[ViewController alloc] init]; 
[self.navigationController pushViewController:viewController animated:true]; 

斯威夫特

let viewController = ViewController() 
navigationController?.pushViewController(viewController, animated: true) 


更新
要将字符串类名称转换为视图控制器,请尝试以下扩展名。

extension NSObject { 

    func viewControllerFromString(viewControllerName: String) -> UIViewController? { 

     if let appName = Bundle.main.infoDictionary?["CFBundleName"] as? String { 
      print("CFBundleName - \(appName)") 
      if let viewControllerType = NSClassFromString("\(appName).\(viewControllerName)") as? UIViewController.Type { 
       return viewControllerType.init() 
      } 
     } 

     return nil 
    } 

} 

现在,得到类字符串您的视图控制器分支扩​​展

if let viewController = viewControllerFromString(viewControllerName: "ViewController") as? ViewController { 
    navigationController?.pushViewController(viewController, animated: true) 
} 

类似的功能:

extension String { 

    func getViewController() -> UIViewController? { 

     if let appName = Bundle.main.infoDictionary?["CFBundleName"] as? String { 
      print("CFBundleName - \(appName)") 
      if let viewControllerType = NSClassFromString("\(appName).\(self)") as? UIViewController.Type { 
       return viewControllerType.init() 
      } 
     } 

     return nil 
    } 

} 


if let viewController = "ViewController".getViewController() as? ViewController { 
    navigationController?.pushViewController(viewController, animated: true) 
} 
+0

是的,这是我所做的,但我的观点是如果通知解析一个字符串的VC实例化,例如“仪表板”,然后我不能通过匹配该字符串的标识符加载,ID需要一个大规模的switch语句,然后在每种情况下运行您的代码 – jackdm

+0

尝试用更新的答案 – Krunal

+0

@Krunal这是什么CFBundleName?从哪里来? – ArgaPK