【问题标题】:How to render .xib (custom view) programmatically by NSClassFromString?如何通过 NSClassFromString 以编程方式呈现 .xib(自定义视图)?
【发布时间】:2018-04-22 17:21:58
【问题描述】:

我是 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”

不管怎样,有没有办法用函数参数定义自定义视图?使用字符串或任何其他方法。

【问题讨论】:

  • 我看不出这与 xib 文件有什么关系。您的代码中没有任何 xib 文件。
  • 确保模数名称与您的应用名称相同。

标签: ios swift xcode swift4 xib


【解决方案1】:

我会说你错了。不要将字符串转换为类型;直接使用类型。

这是一个 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-12
    • 2018-12-02
    • 2016-02-03
    • 1970-01-01
    • 2021-04-28
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多