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.

ToDoBar

Your to-dos on your menu bar.

Ram Patra Published on May 29, 2022
Image placeholder

Keep reading

If this article was helpful, others might be too

question swiftui iOS April 2, 2024 How to open a second view from first view in iOS using SwiftUI?

In SwiftUI, you can open another view (or navigate to another view) on the click of a button by utilizing navigation views and navigation links. Here’s a basic example of how to achieve this:

question swiftui macOS January 26, 2024 How to hide the title bar in a SwiftUI macOS app?

Let’s say you have a view named ContentView and your main App file looks like this:

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.