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!
The error is resolved in Xcode 14 RC