如何使用Swift从其父级的nib创建视图

时间:2015-12-14 11:32:00

标签: ios swift inheritance uiview nib

我认为这个问题非常简单,但经过长时间的搜索,没有找到答案,我试图在这里问:

我有一个带有.xib文件的自定义视图(MyCustomView:UIView)。 要将此类与其nib一起使用,我将添加一个类函数,如下所示

class func addCustomViewToView(view: UIView)
{
    let CV = NSBundle(forClass: MyCustomView.self).loadNibNamed("MyCustomView", owner: self, options: nil).first as! MyCustomView
    CV.frame = CGRectMake(0, 0, view.frame.width, view.frame.height)
    view.addSubview(CV)
}

在我的应用程序的另一个地方,我不得不扩展自定义视图,所以我创建了自定义视图的子类:

class MyExtendedCustomClass : MyCustomClass
{ 
    ...
}

我试图覆盖类函数,但我没有找到使用父nib文件创建子类项的方法。

这样做的正确方法是什么?

谢谢

1 个答案:

答案 0 :(得分:1)

尽管我提出了很长一段时间的问题,但我会添加我的解决方案,希望它对某人有所帮助。

主要问题是我调用了函数

addCustomViewToView(view: UIView)

在subCustomView中,由于该行,它将视图创建为superCustomView类:

let CV = NSBundle...loadNibNamed(...).first as! MyCustomView

所以...

首先,我启动CustomView的方式:

var view:UIViwe!

override public init(frame: CGRect)
{
    super.init(frame: frame)
    self.commonInit()
}

required public init?(coder aDecoder: NSCoder)
{
    super.init(coder: aDecoder)
    self.commonInit()
}

private func commonInit()
{
    let bundle = NSBundle(forClass: self.dynamicType)
    let nib = UINib(nibName: "CustomView", bundle: myBundle)
    self.view = nib.instantiateWithOwner(self, options: nil).first as! UIView
    self.view.frame = self.bounds
    self.view.autoresizingMask = [.FlexibleHeight, .FlexibleWidth]
    //here you can add things to your view....
    self.addSubview(self.view)
}

override public class func layerClass() -> AnyClass
{
    return AVPlayerLayer.self
}

现在我可以使用

从代码中启动此类
init(frame: CGRect)

并通过创建视图从故事板开始,并将其定义为我的CustomView,在这种情况下,将调用下一个init:

init?(coder aDecoder: NSCoder)

在那之后,在继承的视图中,我不应该做任何事情,它是" init"将打电话给" super.init"从CustomView类,将初始化nib文件没有问题。