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
}