我有一个带有导出和自定义 View 的窗口(在我的 .xib
文件中),其中包含一个按钮和一个文本字段。当在窗口中按下按钮时,我想将自定义 View 的实例添加到窗口中。
目前我有一个窗口和自定义 View (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)
}
}
这只会向窗口添加一个 View 。
这是解决问题的正确方法,还是我应该使用完全不同的方法?
最佳答案
您不能两次添加相同的 View 。听起来您正在尝试多次将 customView
的相同 实例添加到 configWindow
,但您无法做到。如果您考虑一下,就会很明显为什么—— super View 将如何管理两个相同的 subview ?它如何知道两者之间的区别?
您应该改为添加 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 文件中初始化多个 View ,并将它们随机添加到一个 View 中。
有趣的部分是:
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 加载自身,然后返回正确类的第一个顶级对象。
关于macos - 在 Swift 中向 NSWindow 添加多个 subview ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27874883/