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

问题是我的应用是通过程序制作的,因此无法添加情节提要标识符。

如何以编程方式解决此问题,以便可以通过字符串引用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)
}

关于ios - 从字符串( View Controller 字符串名称)创建UIViewController类实例,而无需使用Storyboards或NIB/XIB?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46806969/

10-11 23:04
查看更多