loadnibnamed没有加载子视图

Jus*_*ard 1 xib swift

我试图在用户按下按钮时使用loadnibnamed加载一个名为"AddProgramView"的xib字段.我在故事板中创建了xib,在xib视图中放置了各种子视图,并将出口连接到名为AddProgramView的相应swift文件.当我加载xib时,没有任何子视图出现.他们都失踪了.救命?这是我的代码

在我的主视图控制器中:

@IBAction func addProgram(sender: UIButton) {

    if let _ = addProgramView {
        addProgramView!.frame = CGRectMake(0, self.window!.frame.origin.y + self.window!.frame.height, self.window!.frame.width, CGFloat(325))
    }
    else {
        let addProgramViews = NSBundle.mainBundle().loadNibNamed("AddProgramView", owner: self, options: nil)
        addProgramView = addProgramViews.first as? AddProgramView

        addProgramView!.frame = CGRectMake(0, self.window!.frame.origin.y + self.window!.frame.height, self.window!.frame.width, CGFloat(325))

        window?.addSubview(addProgramView!)
    }

    window?.bringSubviewToFront(addProgramView!)

    UIView.animateWithDuration(0.3, delay: 0.0, options: UIViewAnimationOptions.CurveEaseOut, animations: {
        self.addProgramView!.frame.origin.y -= CGFloat(325)
        }, completion: nil)
}
Run Code Online (Sandbox Code Playgroud)

AddProgramView.swift文件:

class AddProgramView: UIView {


    @IBOutlet weak var nameField: UITextField!
    @IBOutlet weak var cancelButton: UIButton!

    @IBOutlet weak var instructionsLabel: UILabel!
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*cur 5

首先检查,如果您在视图中声明了您的类名,而不是在文件所有者中.

班级名称

如果没有,那就去做吧.然后再试一次.

另一种选择是在AddProgramView.swift中创建IBOutlet

@IBOutlet var contentView: UIView!
Run Code Online (Sandbox Code Playgroud)

并从视图中删除类名称并将其添加到文件的所有者.

所有者的班级名称

通过右键单击File的所有者来连接contentView:

在此输入图像描述

然后创建如下的init方法:

class AddProgramView: UIView {
    @IBOutlet var contentView: UIView!

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

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

    func commonInit() {
        NSBundle.mainBundle().loadNibNamed("AddProgramView", owner: self, options: nil)
        self.addSubview(self.contentView)
        self.contentView.frame = self.bounds
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以在任何地方使用AddProgramView.通过init(框架:)

let addProgramView = AddProgramView.init(frame: CGRectMake(0, 0, 320, 30))
Run Code Online (Sandbox Code Playgroud)

或者您可以通过添加UIView直接在故事板内使用它们并将它们设置为AddProgramView(没有额外的代码行,故事板会为您调用init(编码器:))

故事板

我已经为您创建了示例项目 - CustomView项目