Swift - 以编程方式将自定义Xib视图添加为子视图

时间:2016-09-05 01:05:49

标签: ios swift xib addsubview

我之前制作了一个我在故事板中使用过的自定义xib,我只想创建一个自定义视图调整大小的实例,然后将其作为子视图添加到uiscrollview中。我已经尝试在我的视图控制器的viewdidload函数中使用这段代码

let cardView = CardView(coder: NSCoder())
cardView!.frame.size.width = 100
cardView!.frame.size.height = 100
scrollView.addSubview(cardView!)

但我收到此错误

Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '*** -containsValueForKey: cannot be sent to an abstract object
of class NSCoder: Create a concrete instance!'

编辑: 这是连接到CardView.xib

的swift文件的代码
import UIKit

class CardView: UIView {
@IBOutlet var view: UIView!
@IBOutlet weak var cornerView: UIView!

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)

    NSBundle.mainBundle().loadNibNamed("CardView", owner: self, options: nil)
    self.addSubview(view)
    view.frame = self.bounds

    cornerView.layer.cornerRadius = 3
    cornerView.layer.masksToBounds = true

    view.layer.shadowOffset = CGSizeMake(1, 5);
    view.layer.shadowRadius = 2;
    view.layer.shadowOpacity = 0.2;
    view.layer.masksToBounds = false
}

}

而不是使用自动布局我尝试简单地设置高度和宽度来测试从这两行手动添加子视图(也是我刚接触iOS开发的新头)

cardView!.frame.size.width = 100
cardView!.frame.size.height = 100

1 个答案:

答案 0 :(得分:0)

我在使用自定义XIB进行视图初始化时使用的内容如下所示。

在视图的类中,就像你的CardView一样,代码就像。

class CardView: UIView {
    @IBOutlet weak var cornerView: UIView!

    func setupWithSuperView(superView: UIView) {
        self.frame.size.width = 100
        self.frame.size.height = 100
        superView.addSubview(self)

        cornerView = UIView(frame: self.bounds)
        cornerView.layer.cornerRadius = 3
        cornerView.layer.masksToBounds = true

        view.layer.shadowOffset = CGSizeMake(1, 5);
        view.layer.shadowRadius = 2;
        view.layer.shadowOpacity = 0.2;
        view.layer.masksToBounds = false
    }
}

并且您要在此处调用此类进行初始化,请使用此。

let cardView = NSBundle.mainBundle("CardView").loadNibNamed("", owner: nil, options: nil)[0] as! CardView
cardView.setupWithSuperView(scrollView)

尝试一次。但请确保xib文件的第一个视图是CardView类型。我的意思是第一个视图的类是CardView。