【问题标题】:Programmatically create NSWindow以编程方式创建 NSWindow
【发布时间】:2015-03-17 21:04:01
【问题描述】:

我想以编程方式创建一个新的 NSWindow,但是 我找不到成功的方法。 这个简单的代码不会显示新窗口。它有什么问题?

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

    @IBOutlet weak var window: NSWindow!

    func applicationDidFinishLaunching(aNotification: NSNotification) {
        let win = NSWindow(contentRect: NSMakeRect(100, 100, 600, 200),
            styleMask: NSResizableWindowMask,
            backing: NSBackingStoreType.Buffered, defer: true)

        let controller = NSWindowController(window: win)

        controller.showWindow(self)
        win.makeKeyAndOrderFront(win)
    }
}

【问题讨论】:

  • "我的代码有什么问题?"一件事显然是错误的,那就是所有变量都是本地的。因此,当函数结束时,您的窗口控制器和您的窗口都会消失。它们是纯粹的临时对象。
  • 我希望有一些适当的文档。找不到。

标签: swift xcode macos swift3 nswindow


【解决方案1】:

Xcode 11 • Swift 5.1

import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
    @IBOutlet weak var window: NSWindow!
    let newWindow = NSWindow(contentRect: .init(origin: .zero,
                                                size: .init(width: NSScreen.main!.frame.midX,
                                                            height: NSScreen.main!.frame.midY)),
                             styleMask: [.closable],
                             backing: .buffered,
                             defer: false)
    func createNewWindow() {
        newWindow.title = "New Window"
        newWindow.isOpaque = false
        newWindow.center()
        newWindow.isMovableByWindowBackground = true
        newWindow.backgroundColor = NSColor(calibratedHue: 0, saturation: 1.0, brightness: 0, alpha: 0.7)
        newWindow.makeKeyAndOrderFront(nil)
    }
    func applicationDidFinishLaunching(_ aNotification: Notification) {
        createNewWindow()
    }
    func applicationWillTerminate(_ aNotification: Notification) {
        // Insert code here to tear down your application
    }
}

Window Style Mask

Sample project

【讨论】:

  • 确实如此,但是看看 github 上的 Masonry (github.com/SnapKit/Masonry) 还有很多其他选项(如果您喜欢 RX/Reactive,ReactiveCocoaLayout 是一个不错的选择)
  • @DisplayName 也不适合我。我认为此 API 已更新为仅适用于窗口控制器
【解决方案2】:

这是一个没有任何花里胡哨的工作示例,已更新到 Swift 4.2。

它会根据您调用的函数创建一个带有 & 不带 nib 的裸窗口。

在 IB 中,到处取消选中“初始控制器”。要使 nib 版本正常工作,您必须为 IB 提供的窗口控制器提供“WindowController”的故事板 ID。

    import Cocoa

    @NSApplicationMain
    class AppDelegate: NSObject, NSApplicationDelegate, DebugHelper {
        var myName: String = "AppDelegate"
        var windowController: NSWindowController!
        var window: NSWindow!

        func applicationDidFinishLaunching(_ aNotification: Notification) {
            //nib()
            diy()
        }
        func nib() {
            let storyboard = NSStoryboard(name: NSStoryboard.Name("Main"), bundle: nil)
            guard let wc = storyboard.instantiateController(withIdentifier: "WindowController") as? NSWindowController else { return }
            windowController = wc
            wc.showWindow(self)
        }
        func diy() {
            window = NSWindow()
            window.styleMask = NSWindow.StyleMask(rawValue: 0xf)
            window.backingType = .buffered
            window.contentViewController = ViewController()
            window.setFrame(NSRect(x: 700, y: 200, width: 500, height: 500), display: false)
            windowController = NSWindowController()
            windowController.contentViewController = window.contentViewController
            windowController.window = window
            windowController.showWindow(self)
        }
        func applicationWillTerminate(_ aNotification: Notification) {
            // Insert code here to tear down your application
        }
    }

    import Cocoa

    class ViewController: NSViewController, DebugHelper {
        var myName: String = "ViewController"

        override func loadView() {
            view = NSView()
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 2013-03-28
    • 2013-07-25
    • 2013-07-22
    • 2018-06-04
    • 2013-11-24
    相关资源
    最近更新 更多