【发布时间】:2017-08-11 21:10:19
【问题描述】:
我使用 .xib 文件为布局创建了一个自定义视图。我想以编程方式创建此视图并将其作为子视图添加到不同的视图。
子视图类:
class Subview: UIView {
@IBOutlet var view: UIView!
@IBOutlet var titleLabel: UILabel!
@IBOutlet var textLabel: UILabel!
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
Bundle.main.loadNibNamed("Subview", owner: self, options: nil)
self.addSubview(view)
view.frame = self.bounds
}
}
我不知道该怎么做,目前唯一的构造函数需要一个我没有的 NSCoder 实例。
我试图给它一个额外的初始化器:
init(title: String, text: String) {
titleLabel.text = title
textLabel.text = text
super.init(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
}
然后调用它:
let v = Subview(title: dataSource[i].whatever, text: dataSource[i].bla)
但在尝试解开标签出口时失败,这是有道理的,因为 .xib 尚未初始化。
我已经尝试过使用 tableview 和自定义单元格,而不是以编程方式为页面构建 UI,它并没有真正起作用,因为这是一个详细信息页面,我只有一个对象作为我的数据源,而不是rowForIndexPath 表视图委托期望的数组。我知道我可以编写一些映射器方法来将对象转换为它的属性数组,但如果可能的话,我宁愿避免这样做。
谢谢。
【问题讨论】:
-
因为在您的情况下,只有类已被初始化,而不是网点,因为未分配 nib 初始化,您可以尝试
self = Bundle.main.loadNibNamed("Subview", owner: self, options: nil)?[0] -
感谢您的回复,当我尝试任一解决方案时,我在尝试使用 Bundle.main.loadLibNamed 时看到此错误:此类与键的键值编码不兼容,我认为是网点的问题。我还应该注意,我可以毫无问题地将 xib 添加到我的故事板中,我可能需要创建多个,这就是为什么我需要弄清楚如何以编程方式完成它。