似乎不可能使用界面生成器创建的.xib创建嵌套的自定义子视图.例如,我想创建一个自定义BarView
,并在其中嵌套一个自定义FooView
,其中每个视图的内容在IB中创建并存储在
BarView
从其.xib文件加载,并作为ViewController
的viewDidLoad()
方法中的子视图添加:
class ViewController: UIViewController {
var barView : BarView?
override func viewDidLoad() {
super.viewDidLoad()
self.barView =
(UINib(nibName: "BarView", bundle:Bundle.main).
instantiate(withOwner: nil, options: nil).first as? BarView)
self.view.addSubview(self.barView!)
}
}
我可以为IB创建的UIButton
个插座创建和连接:
class BarView: UIView {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
NSLog("BarView init:NSCoder, barButton set: \(barButton != nil)")
}
public override func awakeFromNib() {
super.awakeFromNib()
NSLog("BarView: awakeFromNib(), barButton set: \(barButton != nil)")
}
@IBOutlet weak var barButton: UIButton!
}
我还可以将插座和动作连接到nest FooView
:
class FooView: UIView {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
NSLog("FooView init:NSCoder, fooButton set: \(fooButton != nil)")
}
public override func awakeFromNib() {
super.awakeFromNib()
NSLog("FooView: awakeFromNib(), fooButton set: \(fooButton != nil)")
}
@IBAction func doFoo(_ sender: Any) {
NSLog("doFoo")
}
@IBOutlet weak var fooButton: UIButton!
}
我可以看到init?(NSCoder)
和awakeFromNib()
方法确实被调用了.我不知道为什么调用BarView
的方法
... BarView init:NSCoder, barButton set: false
... BarView: awakeFromNib(), barButton set: false
... FooView init:NSCoder, fooButton set: false
... BarView init:NSCoder, barButton set: false
... BarView: awakeFromNib(), barButton set: true
... FooView: awakeFromNib(), fooButton set: false
FooView
(即fooButton
)的内容不显示,在FooView
个回调中为nil
.是否支持使用独立的.xib文件创建嵌套自定义视图?如果是这样,实现这一点的诀窍是什么?
各种建议in this post不太正确或不起作用.