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

时间:2017-10-18 09:31:19

标签: ios swift class viewcontroller identifier

我想从推送通知中实例化视图控制器,大多数教程似乎建议传递VC的标识符并将它们与storyboardID匹配。

问题是我的应用程序是以编程方式编写的,因此我无法添加故事板标识符。

如何以编程方式解析此问题,以便我可以通过字符串引用VC?

更新: 我的意思是,如果通知解析了要实例化的VC的字符串,例如" Deashboard"我不能通过匹配该字符串的标识符加载,id需要一个庞大的switch语句,以便在每种情况下运行代码的每种可能性

1 个答案:

答案 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)
}