NavigationStack - returning to root view

29 Views Asked by At

I am developing (and maintaining) a SwiftUI based macOS app. Recently I have implemented navigation by NavigationStack. This is an alternative to other navigations and is selectable by user..

My problem is returning to root view. After a view and task is completed I remove all instances on path (path.removeAll()). The path is a Binding to subviews, but deleting all instances on path does not return to root view... Any suggestions?

import SwiftUI

struct NavigationSidebarTasksView: View {
    @SwiftUI.Environment(\.rsyncUIData) private var rsyncUIdata
    @Binding var selecteduuids: Set<Configuration.ID>
    @Binding var reload: Bool
    @State private var estimatingprogressdetails = EstimateProgressDetails()
    @StateObject private var progressdetails = ExecuteProgressDetails()
    // Which view to show
    @State var path: [Tasks] = []

    var body: some View {
        NavigationStack(path: $path) {
            NavigationTasksView(estimatingprogressdetails: estimatingprogressdetails,
                                reload: $reload,
                                selecteduuids: $selecteduuids,
                                path: $path)
                .environmentObject(progressdetails)
                .navigationDestination(for: Tasks.self) { which in
                    makeView(view: which.task)
                }
                .task {
                    if SharedReference.shared.firsttime {
                        path.append(Tasks(task: .firsttime))
                    }
                }
        }
    }

    @ViewBuilder
    func makeView(view: DestinationView) -> some View {
        switch view {
        case .executestimatedview:
            NavigationExecuteEstimatedTasksView(estimatingprogressdetails: estimatingprogressdetails,
                                                selecteduuids: $selecteduuids,
                                                reload: $reload,
                                                path: $path)
                .environmentObject(progressdetails)
        case .executenoestimatetasksview:
            NavigationExecuteNoestimatedTasksView(reload: $reload,
                                                  selecteduuids: $selecteduuids,
                                                  path: $path)
        case .estimatedview:
            NavigationSummarizedAllDetailsView(estimatingprogressdetails: estimatingprogressdetails,
                                               selecteduuids: $selecteduuids,
                                               path: $path)
                .environmentObject(progressdetails)
        case .firsttime:
            NavigationFirstTimeView()
        case .dryrunonetask:
            NavigationDetailsOneTaskRootView(estimatingprogressdetails: estimatingprogressdetails,
                                             selecteduuids: estimatingprogressdetails.uuids)
                .onDisappear {
                    progressdetails.setestimatedlist(estimatingprogressdetails.getestimatedlist())
                }
        case .dryrunonetaskalreadyestimated:
            NavigationDetailsOneTask(estimatedlist: estimatingprogressdetails.getestimatedlist() ?? [],
                                     selecteduuids: estimatingprogressdetails.uuids)
        case .alltasksview:
            NavigationAlltasksView()
        }
    }
}

enum DestinationView: String, Identifiable {
    case executestimatedview, executenoestimatetasksview,
         estimatedview, firsttime, dryrunonetask, alltasksview,
         dryrunonetaskalreadyestimated
    var id: String { rawValue }
}

struct Tasks: Hashable, Identifiable {
    let id = UUID()
    var task: DestinationView
}
0

There are 0 best solutions below