从字符串(视图控制器字符串名称)创建一个UIViewController类实例,而不使用Storyboard或NIB/XIB?
问题描述:
我想从推送通知实例化视图控制器,大多数教程似乎建议传递VC的标识符并将它们与storyboardID进行匹配。从字符串(视图控制器字符串名称)创建一个UIViewController类实例,而不使用Storyboard或NIB/XIB?
问题是我的应用程序是编程方式,所以我不能添加故事板标识符。
我该如何解决这个编程,所以我可以通过一个字符串引用VC?
更新:
我的观点是,如果通知解析一个字符串的VC实例化例如“仪表板”,然后我不能通过匹配该字符串的标识符加载,ID需要一个大规模的switch语句,然后在每种情况下运行您的代码
答
当视图控制器不与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)
}
你有故事板为您的视图控制器设计(无赛格瑞连接)? – Krunal
没有它的所有程序 – jackdm
“所以我可以引用一个VC”,你是如何初始化它?您不必使用storyboardID,您可以执行'MyVCForPush * vc = [[MyVCForPush alloc] init]'; 'MyVCForPush * vc = [[MyVCForPush alloc] initWithXibName:@someName]',然后'[vc setPushInfo:myPushInfo]',然后显示它。 – Larme