Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从字符串获取类并在Swift中传递参数_Ios_Swift - Fatal编程技术网

Ios 从字符串获取类并在Swift中传递参数

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

我在objective-c中有一个方法,它接受字符串并转换为类,然后将一些公共对象传递给它

-(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
,找到一些解决方案可能会有所帮助?在这种情况下,您能否建议如何从故事板加载视图。