在Swift中添加多个子视图到NSWindow

时间:2015-01-10 09:53:21

标签: macos cocoa swift

我有一个带插座的窗口和一个自定义视图(在我的.xib文件中),其中包含一个按钮和一个文本字段。当在窗口中按下按钮时,我想在窗口中添加自定义视图的实例。

目前我有一个窗口和自定义视图(configWindowcustomView)的插座,按下按钮时会调用此操作:

@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)
    }
}

这只会向窗口添加一个视图。

这是正确的方法,还是我应该使用完全不同的方法?

1 个答案:

答案 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加载自身,然后返回正确类的第一个顶级对象。