我有一个带插座的窗口和一个自定义视图(在我的.xib
文件中),其中包含一个按钮和一个文本字段。当在窗口中按下按钮时,我想在窗口中添加自定义视图的实例。
目前我有一个窗口和自定义视图(configWindow
和customView
)的插座,按下按钮时会调用此操作:
@IBAction func addView(sender: NSButton) {
configWindow.contentView.addSubview(customView)
// Print the views in the window, see what's been added
for i in configWindow.contentView.subviews {
println(i)
}
}
这只会向窗口添加一个视图。
这是正确的方法,还是我应该使用完全不同的方法?
答案 0 :(得分:2)
您无法两次添加相同的视图。听起来您尝试多次将customView
的相同实例添加到configWindow
,这是您无法做到的。如果你考虑一下,那就明白为什么 - superview如何管理两个相同的子视图?怎么会知道他们俩之间的区别呢?
您应该添加CustomView
类的不同实例:
@IBAction func addView(sender: NSButton) {
let customView = CustomView(frame: <some frame>)
configWindow.contentView.addSubview(customView)
// Print the views in the window, see what's been added
for i in configWindow.contentView.subviews {
println(i)
}
}
已编辑添加 我已经创建了一个示例项目,您可以在https://bitbucket.org/abizern/so-27874883/get/master.zip
下载这基本上会从nib文件中初始化多个视图,并将它们随机添加到视图中。
有趣的部分是:
class CustomView: NSView {
@IBOutlet weak var label: NSTextField!
class func newCustomView() -> CustomView {
let nibName = "CustomView"
// Instantiate an object of this class from the nib file and return it.
// Variables are explicitly unwrapped, since a failure here is a compile time error.
var topLevelObjects: NSArray?
let nib = NSNib(nibNamed: nibName, bundle: NSBundle.mainBundle())!
nib.instantiateWithOwner(nil, topLevelObjects: &topLevelObjects)
var view: CustomView!
for object: AnyObject in topLevelObjects! {
if let obj = object as? CustomView {
view = obj
break
}
}
return view
}
}
我创建自定义类的工厂方法,从nib加载自身,然后返回正确类的第一个顶级对象。