Adding a NavigationLink with an empty view didn't work for me. I solved my issue removing all NavigationLink
s from the ForEach and using a single one to control the navigation to the detail view, a tap gesture and 2 state variables to keep track on what is being tapped on.
The example broken code and fix can be found at Paul Hudson's site.
https://www.hackingwithswift.com/forums/swiftui/unable-to-present-please-file-a-bug/7901/8237
Below is the complete working version
| import SwiftUI |
| |
| struct NavigationViewOptions { |
| enum OptionType { case main, optional } |
| typealias Option = (id: UUID, value: String, type: Self.OptionType) |
| static var options: [Option] = [ |
| (UUID(), "Option 1", .main), |
| (UUID(), "Option 2", .optional), |
| (UUID(), "Option 3", .main), |
| (UUID(), "Option 4", .main), |
| (UUID(), "Option 5", .optional), |
| ] |
| |
| static func buildView(for option: Option) -> some View { |
| switch option.type { |
| case .main: |
| return Text("Main Option selected\n\(option.value)").font(.title).fontWeight(.bold) |
| case .optional: |
| return Text("Optional Option selected\n\(option.value)").font(.title3).italic().fontWeight(.medium) |
| } |
| } |
| } |
| |
| struct NavigationViewWorking: View { |
| |
| |
| @State private var selectedOption: NavigationViewOptions.Option = (id:UUID(),"",.main) |
| @State private var showDetail: Bool = false |
| |
| var body: some View { |
| NavigationView { |
| ScrollView{ |
| VStack (alignment:.leading) { |
| Text("NAVIGATION FIX FOR:\nUnable to present. Please file a bug.") |
| .padding(.bottom, 40) |
| |
| ForEach(NavigationViewOptions.options, id: \.id) { option in |
| Text(option.value) |
| .font(.title) |
| .padding(.vertical, 10) |
| .foregroundColor(.accentColor) |
| |
| .onTapGesture { |
| selectedOption = option |
| showDetail = true |
| } |
| } |
| Spacer() |
| NavigationLink("", destination: NavigationViewOptions.buildView(for: selectedOption), isActive: $showDetail) |
| .opacity(0) |
| } |
| .navigationTitle("Options") |
| } |
| |
| Text("Select option from the left") |
| } |
| } |
| } |