Search code examples
swiftuiswiftui-navigationlink

SwiftUI encountered an issue when pushing aNavigationLink. Please file a bug


I'm helping a community of blind people to build an app to share information in a comfortable way. Now I'm running into an issue I can't solve or even had a chance to handle it. The answers from the search doesn't seem to help me...

In the attached video you can find the unpredictable behavior: https://www.eckeonline.de/example.MP4 If I tap on a special category (NavigationLink) the view jumps right back and the console prompts: SwiftUI encountered an issue when pushing aNavigationLink. Please file a bug.

I can do the same with another category without problems...

here is the code:

struct CategoryView: View {
    
    @EnvironmentObject var blindzeln: BLINDzeln
    @State private var showingAlertNoData = false
    @State private var showingAlertNoInternet = false
    
    var body: some View {
        VStack(spacing: 100){
            NavigationView {
                List(blindzeln.listOfCategories.uniqued(), id: \.self) { item in
                    if blindzeln.listOfCategories[0] != " " {
                        NavigationLink(destination: CategoryDetailView(categoryTitle: item, catID: blindzeln.findCatID(item: item))) {
                            
                            VStack{
                                
                                HStack{
                                    VStack(alignment: .leading) {
                                        Text(item)
                                            .font(.system(size: 100))
                                            .lineLimit(1)
                                            .minimumScaleFactor(0.1)
                                            .foregroundColor(.primary)
                                    }
                                }
                                .padding()
                                BigDivider()
                            }
                        }.listRowSeparatorTint(.primary)
                            .listRowSeparator(.hidden)
                    }
                }
                .listStyle(.inset)
                .refreshable {
                    if !cellMonitor.isReachable {showingAlertNoInternet = true}
                    await blindzeln.updateAllData()
                }
                .navigationTitle("Kategorien")
                .navigationBarTitleDisplayMode(.inline)
                .toolbar(content: {
                    ToolbarItem(placement: .principal, content: {
                        Text("Kategorien")
                    })})
            }
            .alert("Keine Daten vorhanden! \n Nach unten ziehen zum aktualisieren.", isPresented: $showingAlertNoData) {
                Button("OK", role: .cancel) { }
            }
            .alert("Du scheinst offline zu sein. Bitte eine Verbindung zum Internet herstellen!", isPresented: $showingAlertNoInternet) {
                Button("OK", role: .cancel) { }
            }
            .task() {
                if blindzeln.listOfCategories[0] == " " {
                    // print ("leer")
                    await blindzeln.loadCategoriesFromFile()}
                //   else {print("ANzahl KAtegorien \(blindzeln.listOfCategories.count)")}
                //  await blindzeln.loadData()
                await blindzeln.updateAllData()
                if blindzeln.listOfCategories.count == 0 {showingAlertNoData = true
                }
            }
        }
        .onAppear(){
            blindzeln.listOfCategoriesFiles = defaults.object(forKey:"SavedCategoryFiles") as? [String] ?? ["categories"]
        }
        
        
    }
}

For your further understanding here is the struct the NavigationView calls:

struct CategoryDetailView: View {
    
    @EnvironmentObject var blindzeln: BLINDzeln
    @AppStorage ("version") var version: Int = 0
    @State var shouldRefresh: Bool = false
    @State private var searchText = ""
    let categoryTitle: String
    let catID: Int
    
    var body: some View {
        VStack{
            List {
                ForEach(blindzeln.results.filter { searchText.isEmpty || ($0.title.localizedCaseInsensitiveContains(searchText) || $0.textBody.localizedCaseInsensitiveContains(searchText)) }, id: \.entryID){ item in
                  
                    switch item.mediaType{
                    case "image":
                        NavigationLink(destination: ItemDetailViewImage(item: item, isFavorite: false, catID: catID)) {DisplayEntryView(item: item)}.listRowSeparatorTint(.primary).listRowSeparator(.hidden)
                        
                    case "speech":
                        NavigationLink(destination: ItemDetailViewText2Speech(item: item, isFavorite: false, catID: catID)) {DisplayEntryView(item: item)}.listRowSeparatorTint(.primary).listRowSeparator(.hidden)
                    case "vcf":
                        NavigationLink(destination: ItemDetailViewVcf(item: item, isFavorite: false, catID: catID)) {DisplayEntryView(item: item)}.listRowSeparatorTint(.primary).listRowSeparator(.hidden)
                    case "cal":
                        NavigationLink(destination: ItemDetailViewWithCalendar(item: item, isFavorite: false, catID: catID)) {DisplayEntryView(item: item)}.listRowSeparatorTint(.primary).listRowSeparator(.hidden)
                    
                    case "text":
                        NavigationLink(destination: ItemDetailViewText(item: item, isFavorite: false, catID: catID)) {DisplayEntryView(item: item)}.listRowSeparatorTint(.primary).listRowSeparator(.hidden)
                    case "audio":
                        NavigationLink(destination: ItemDetailViewMP3(item: item, isFavorite: false, catID: catID)) {DisplayEntryView(item: item)}.listRowSeparatorTint(.primary).listRowSeparator(.hidden)
                        
                    default:
                        NavigationLink(destination: ItemDetailViewStandard(item: item, isFavorite: false, catID: catID)) {DisplayEntryView(item: item)}.listRowSeparatorTint(.primary).listRowSeparator(.hidden)
                    }
                      
                }
            }
            .searchable(text: $searchText, placement: .navigationBarDrawer(displayMode: .always), prompt: "") {}
            
            .navigationTitle(categoryTitle)
            .navigationBarTitleDisplayMode(.inline)
            .listStyle(.inset)
        }
        .task(){
            await blindzeln.decodeCategoryData(showCategory: categoryTitle)
        }
       
    }
    
}

If anyone has a hint for me, please share! Thank you!


Solution

  • The error is resolved in Xcode 14 RC