Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiple windows of the same SwiftUI (mac) app share the same state

Tags:

swift

swiftui

so this is basically a Hail Mary, but I'm really out of ideas as to what could be causing this: I have a small mac-app that uses the default WindowGroup, which according to the documentation ensures that.

"Each window created by the group maintains an independent state. For example, for each new window created from the group, new memory is allocated for any State or StateObject variables instantiated by the scene's view hierarchy."

Nevertheless, the NavigationView shows the same selected list across all windows. Put differently, selectedLabel shares and updates across multiple windows, even tho in my humble understanding this is not supposed to happen.

Another problem, which I don't know if it's related, is that both windowStyle and windowToolbarStyle set on this WindowGroup are ignored.

It may be a minor issue, but I'm really stuck here, so any help would be appreciated!

My MainApp (simplified):

import SwiftUI

@main
struct MainApp: App {
    @State private var selectedLabel: ViewModel? = .init()
    
    var body: some Scene {
        WindowGroup {
            SidebarView(selectedLabel: $selectedLabel)
        }
        .windowStyle(HiddenTitleBarWindowStyle())
        .windowToolbarStyle(UnifiedCompactWindowToolbarStyle())
    }
}

My Sidebar (also simplified):

import SFSafeSymbols
import SwiftUI

struct SidebarView: View {
    @ObservedObject var viewModel = SidebarViewModel()
    @Binding var selectedLabel: ViewModel?
    
    var body: some View {
        NavigationView {
            VStack {
                Button(action: {
                    viewModel.createStockList()
                }, label: {
                    Image(systemSymbol: .plus)
                })
                
                List(viewModel.stockLists, id: \.id) { stockList in
                    NavigationLink(destination: StockListView(viewModel: stockList),
                                   tag: stockList,
                                   selection: $selectedLabel) {
                            Text(stockList.name)
                    }
                }
            }
        }
    }
}

1 Answers

You're storing your selectedLabel at the WindowGroup level and passing it to each sidebar. You should store that state in the SidebarView if you want it to be different.

like image 161
jnpdx Avatar answered Sep 13 '25 06:09

jnpdx