如何通过NSClassFromString以编程方式呈现.xib(自定义视图)?

时间:2018-04-22 17:21:58

标签: ios swift xcode swift4 xib

我是Swift的新手。 目前我已经制作了serval xib文件,它们可以使用以下代码进行渲染

    let mySubview:customView = customView(frame: CGRect(x:10,y:300, width: 312, height:355))
    self.view.addSubview(mySubview)

“customView”是自定义视图(.xib)文件,还有许多其他文件。但是,我想用函数参数渲染它。我使用过字符串,但是我得到了一个错误:

func addComp(name:String){
   let className = NSClassFromString("MyApp."+name) as! UIView.Type
   let subview = className.init()
  subview.frame = CGRect(x:10,y:300, width: 312, height:355)
  self.view.addSubview(subview)
   }

它说

  

“致命错误:在打开可选值时意外发现nil”

无论如何,有没有办法用函数参数定义自定义视图?使用字符串或任何其他方法。

1 个答案:

答案 0 :(得分:0)

我说你出现了这个错误。不要把一个字符串变成一个类型;直接使用类型。

这是一个UIView子类,其工厂方法可以完成addComp所做的一切:

class MyFactoryView : UIView {
    required override init(frame:CGRect) {
        super.init(frame:frame)
    }
    required init?(coder aDecoder: NSCoder) {
        super.init(coder:aDecoder)
    }
    static func make(andAddTo v:UIView) {
        let subv = self.init(frame:CGRect(x:10,y:300, width: 312, height:355))
        v.addSubview(subv)
    }
}

好的,所以我们假设我们有一些这种类型的子类:

class MyView1 : MyFactoryView {}
class MyView2 : MyFactoryView {}

所以现在不需要任何字符串。为了制作我们的小戏剧,我们直接谈谈这种类型;例如:

MyView1.make(andAddTo:self.view)