我想从推送通知中实例化视图控制器,大多数教程似乎建议传递VC的标识符并将它们与storyboardID匹配。
问题是我的应用程序是以编程方式编写的,因此我无法添加故事板标识符。
如何以编程方式解析此问题,以便我可以通过字符串引用VC?
更新: 我的意思是,如果通知解析了要实例化的VC的字符串,例如" Deashboard"我不能通过匹配该字符串的标识符加载,id需要一个庞大的switch语句,以便在每种情况下运行代码的每种可能性
答案 0 :(得分:1)
当视图控制器未与storybaord或nib文件关联时,它的(类)默认初始化器提供视图控制器的实例。
试试这个并参见:
<强>目标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)
}