String需要根据项目名生成命名空间前缀+类名 再将String转换成需要生成的类型Type 再调用 Type.init() 生成对象
// MARK: - 根据String生成ViewController
func classFromString(_ className: String) -> UIViewController? {
// 项目名称不能包含: 数字 - or 其他一些特殊符号, 否则转换不了
guard let appName = Bundle.main.infoDictionary!["CFBundleName"] as? String else {
print("未获取到命名空间")
return nil
}
let str = "\(appName).\(className)"
print(str)
guard let vcClass = NSClassFromString(str) else {
print("未获取到对应类")
return nil
}
guard let vcType = vcClass as? UIViewController.Type else {
print("未转换成控制器类")
return nil
}
let vc = vcType.init()
return vc
}