Loading...

How to open a window in SwiftUI using NSWindowController?

question swiftui swift
Ram Patra Published on May 29, 2022

Although many things in SwiftUI are idiomatic and straightforward, showing your view in a new window needs a bit of coding to do. Hence, this short post.

First, let’s create a Window Controller that will hold your window/view:

import AppKit
import SwiftUI

class WindowController<RootView: View>: NSWindowController {
    convenience init(rootView: RootView) {
        let hostingController = NSHostingController(rootView: rootView.frame(width: 400, height: 400))
        let window = NSWindow(contentViewController: hostingController)
        window.setContentSize(NSSize(width: 400, height: 400))
        self.init(window: window)
    }
}

What we’re doing here is creating a Hosting Controller (which is a subclass of View Controller) that takes your supplied View, does its magic, and then gives it to NSWindow.

Now, let’s create two Views in SwiftUI, Parent and Child, like below:

import SwiftUI

struct NewWindowParentView: View {
    @State private var windowCount = 1
    
    var body: some View {
        Button("Show new window") {
            let windowController = WindowController(rootView: NewWindowChildView())
            windowController.window?.title = "Child Window \(windowCount)"
            windowCount += 1
            windowController.showWindow(nil)
        }
    }
}
import SwiftUI

struct NewWindowChildView: View {
    var body: some View {
        Text("Child view")
    }
}

Parent View resemble whatever your main View in your app is and the Child View is the View that you want to show in a new Window.

That’s it. So, when you open the Parent View, you will see a Button and every time you press this button, a new Window will be created showing your Child View.

Lastly, the entire example code can be found on GitHub.

Note: Apple has now added better ways to open windows programmatically in SwiftUI.

Presentify

Take your presentation to the next level.

FaceScreen

Put your face and name on your screen.

KeyScreen

Show keypresses on your screen.

ToDoBar

Your to-dos on your menu bar.

SimpleFill

Fill forms using your right-click menu.

IconSim

Preview your Mac app icons.

Ram Patra Published on May 29, 2022
Image placeholder

Keep reading

If this article was helpful, others might be too

question swiftui macos September 3, 2024 How to open and close windows programmatically in SwiftUI?

To open or close a window programmatically from outside that window using environment variables, you need to leverage the new openWindow (macOS 13+) and dismissWindow (macOS 14+) environment variables. This environment variables allow you to programmatically open and close a window by its identifier.

question swiftui swift September 8, 2024 How to loop through an enum in SwiftUI?

In SwiftUI, looping through an enum is not directly possible without some extra work because enums in Swift don’t inherently support iteration. However, you can achieve this by making the enum CaseIterable, which automatically provides a collection of all cases in the enum.

question swiftui macos September 29, 2025 Adding Tooltips to SwiftUI Views on macOS

Tooltips are a subtle but powerful way to improve usability on macOS. They give users extra context when they hover over buttons, text, or icons without cluttering the main UI. SwiftUI makes it easy to add tooltips — and also flexible enough to create custom ones when you need more control.

Like my work?

Please, feel free to reach out. I would be more than happy to chat.