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

Posted

技术标签:

【中文标题】如何使用 Swift 从其父级的笔尖创建视图【英文标题】:How to create view from its parent's nib using Swift 【发布时间】:2015-12-14 11:32:00 【问题描述】:

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

我有一个带有 .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 文件创建子类项的方法。

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

谢谢

【问题讨论】:

您的 addCustomViewToView 方法错误。 loadNibNamed 返回一个 NSArray。然后,您必须在该数组中找到视图。 (我手头没有代码,你应该可以在网上找到它。)我通常将文件的所有者设置为父VC类,然后在调用loadNibNamed之后连接出口。 @DuncanC 他可能将视图分配给文件所有者中名为PC 的属性。这就是他不使用CV 变量的原因。 感谢 Duncan C,我已修复,只是错字.. 【参考方案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”将从 CustomView 类中调用“super.init”并毫无问题地初始化 nib 文件。

【讨论】:

以上是关于如何使用 Swift 从其父级的笔尖创建视图的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:如何使按钮扩展到其父级的大小?

在单元格中,如何定位和调整从具有自动布局的笔尖创建的视图?

Swift iOS - 如何使 CollectionView 的单元格大小

SWIFT:如何以编程方式设置集合视图的帧大小,使其等于其父视图?

获取对话框中视图相对于其父级的位置

iOS Swift SpriteKit:如何使子精灵节点的位置和动作与其父精灵节点相同?