Ios 从字符串获取类并在Swift中传递参数
我在objective-c中有一个方法,它接受字符串并转换为类,然后将一些公共对象传递给它Ios 从字符串获取类并在Swift中传递参数,ios,swift,Ios,Swift,我在objective-c中有一个方法,它接受字符串并转换为类,然后将一些公共对象传递给它 -(UIViewController*)getUIViewController{ NSString* templateID = @"templateId"; // This value is coming from ba ckend Class c = NSClassFromString(templateID); UIViewController* vc = [[c alloc] initWithApp
-(UIViewController*)getUIViewController{
NSString* templateID = @"templateId"; // This value is coming from ba ckend
Class c = NSClassFromString(templateID);
UIViewController* vc = [[c alloc] initWithAppRender:appRenderer];
return vc;
}
现在,同样的事情转化为斯威夫特
func getUIViewController() -> UIViewController? {
let templateID = "templateId"
let className = Bundle.main.infoDictionary!["CFBundleName"] as! String + "." + templateID
let aClass = NSClassFromString(className) as! UIViewController.Type
return aClass.init()
}
这里的问题是无法传递存在于所有视图控制器中的公共对象。我想传递objective-c中的Appender对象。我建议您为所有ViewController创建一个基类,如下所示
class BaseViewController: UIViewController {
private var render: NSObject?
required init(appRenderer: NSObject?) {
super.init(nibName: nil, bundle: nil)
self.render = appRenderer
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
然后您可以从服务器中实例化返回的类名,如下所示
func getUIViewController() -> UIViewController? {
let templateID = "templateId"
let className = Bundle.main.infoDictionary!["CFBundleName"] as! String + "." + templateID
let aClass = NSClassFromString(className) as! BaseViewController.Type
let vc = aClass.init(appRenderer: nil)
return vc
}
您的所有ViewController是否都有一个基本控制器?您需要扩展
UIViewController
,以获得额外的便利init
,它可以接受附件程序
@Kamran我没有基本控制器controller@Paulw11即使我有便利。我需要从类对象扭曲视图控制器。我想省去包装,从Type
初始化类可以通过required
初始化器来完成,但是由于我们不能在extension
中添加required
初始化器,所以扩展UIViewController
似乎是不可能的。您能否在定义obj-c代码的地方与Appender共享它的initWithAppender
,找到一些解决方案可能会有所帮助?在这种情况下,您能否建议如何从故事板加载视图。