loadnibnamed 不加载子视图
loadnibnamed not loading subviews
我正在尝试在用户按下按钮时使用 loadnibnamed 加载名为 "AddProgramView" 的 xib 文件。我在故事板中创建了 xib,在 xib 视图中放置了各种子视图,并将出口连接到名为 AddProgramView 的相应 swift 文件。当我加载 xib 时,会出现 none 个子视图。他们都失踪了。帮助?这是我的代码
在我的主视图控制器中:
@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)
}
AddProgramView.swift 文件:
class AddProgramView: UIView {
@IBOutlet weak var nameField: UITextField!
@IBOutlet weak var cancelButton: UIButton!
@IBOutlet weak var instructionsLabel: UILabel!
}
首先检查一下,如果您的 class 名称是在视图本身而不是文件所有者中声明的。
如果没有,那就去做吧。然后再试一次。
另一个选择 是在您的 AddProgramView.swift
中创建 IBOutlet
@IBOutlet var contentView: UIView!
并从视图中删除 class 名称并将其添加到文件所有者。
通过右键单击文件所有者连接 contentView:
然后像这样创建初始化方法:
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
}
}
现在您可以随时随地使用 AddProgramView。通过 init(frame:)
let addProgramView = AddProgramView.init(frame: CGRectMake(0, 0, 320, 30))
或者您可以通过添加 UIView 并将它们 class 设置为 AddProgramView 直接在故事板中使用它们(没有额外的代码行,故事板将调用 init(coder: ) 给你)
我已经为您创建了示例项目 - CustomView project
仔细检查您的 xib 文件中是否没有指定大小 class。它应该在编辑器 window.
的底部显示 Any/Any
我正在尝试在用户按下按钮时使用 loadnibnamed 加载名为 "AddProgramView" 的 xib 文件。我在故事板中创建了 xib,在 xib 视图中放置了各种子视图,并将出口连接到名为 AddProgramView 的相应 swift 文件。当我加载 xib 时,会出现 none 个子视图。他们都失踪了。帮助?这是我的代码
在我的主视图控制器中:
@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)
}
AddProgramView.swift 文件:
class AddProgramView: UIView {
@IBOutlet weak var nameField: UITextField!
@IBOutlet weak var cancelButton: UIButton!
@IBOutlet weak var instructionsLabel: UILabel!
}
首先检查一下,如果您的 class 名称是在视图本身而不是文件所有者中声明的。
如果没有,那就去做吧。然后再试一次。
另一个选择 是在您的 AddProgramView.swift
中创建 IBOutlet@IBOutlet var contentView: UIView!
并从视图中删除 class 名称并将其添加到文件所有者。
通过右键单击文件所有者连接 contentView:
然后像这样创建初始化方法:
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
}
}
现在您可以随时随地使用 AddProgramView。通过 init(frame:)
let addProgramView = AddProgramView.init(frame: CGRectMake(0, 0, 320, 30))
或者您可以通过添加 UIView 并将它们 class 设置为 AddProgramView 直接在故事板中使用它们(没有额外的代码行,故事板将调用 init(coder: ) 给你)
我已经为您创建了示例项目 - CustomView project
仔细检查您的 xib 文件中是否没有指定大小 class。它应该在编辑器 window.
的底部显示 Any/Any