macos - 在 Swift 中向 NSWindow 添加多个 subview

标签 macos cocoa swift

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

目前我有一个窗口和自定义 View (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)
    }
}

这只会向窗口添加一个 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/

相关文章:

ios - 立即切换输入类型时如何在iOS 11中获取表情符号键盘的高度?

sql-server - 无法在 Mac 上使用 Docker 连接 SQL Server

cocoa - 在 cocoa 中保存 CSV

swift - 对 SpriteKit 节点进行分组,以及 zPosition 控制

objective-c - 在 Cocoa 中你更喜欢 NSInteger 还是 int,为什么?

objective-c - 有没有办法在 NSCollectionView 中有不同的 View ?

ios - 获取用户位置

objective-c - 文件夹观察者 - Cocoa/Obj C

c++ - OS X 从 Carbon 到 Cocoa 窗口创建?

ruby - 命令 "ruby"在我的 Mac 上什么都不做