1
votes

I am doing an app about my school buildings and floors, and I use Navigation View, however, I don't want to view disclosure indicator, so I found "hack" to set navigation link width to 0 and also opacity. When I want to do it also with last NavigationLink, my app crashes in App Delegate file with Bad access during initialisation. When I don't use HStack and this "hack" on last item, it appears to look like the other list rows, but wont do any action. Only way it works is when the next view is inside Navigation Link, which causes home screen to have last List row looking differently. Any ideas? Thank you very much. Screenshot from simulator with last list row with disclosure indicator

import SwiftUI

struct BuildingsView: View {

    init() {
        UITableView.appearance().separatorStyle = .none
    }

    var body: some View {
        NavigationView {
            List {
                HStack{
                    BuildingCardView(titleString: "Námestie J. Herdu", subtitleString: "Námestie J. Herdu 2, Trnava", imageString: "namjherdu", infoString: "Rektorát, FMK, FF, FPV, internáty, jedáleň, kancelárie")
                    NavigationLink(destination: NamJHerduView()) {
                    EmptyView()}
                        .frame(width: 0)
                        .opacity(0)
                }
                HStack {
                    BuildingCardView(titleString: "Hajdóczyho", subtitleString: "Jána Hajdóczyho 1, Trnava", imageString: "hajdoczy", infoString: "Knižnica, učebne, kancelárie, Kino OKO")
                    NavigationLink(destination: HajdoczyhoView()) {
                    EmptyView()}
                        .frame(width: 0)
                        .opacity(0)
                }
                HStack {
                    BuildingCardView(titleString: "Bučianska", subtitleString: "Bučianska 4A, Trnava", imageString: "bucianska", infoString: "FSV, FMK, aula, kancelárie")
                    NavigationLink(destination: BucianskaView()) {
                    EmptyView()}
                        .frame(width: 0)
                        .opacity(0)
                }
                HStack {
                    BuildingCardView(titleString: "V Jame", subtitleString: "V Jame 3, Trnava", imageString: "vjame", infoString: "FMK, FSV, jedáleň")
                    NavigationLink(destination: VJameView()) {
                    EmptyView()}
                        .frame(width: 0)
                        .opacity(0)
                }
                HStack {
                    BuildingCardView(titleString: "Skladová", subtitleString: "Skladová 3, Trnava", imageString: "skladova", infoString: "FMK")
                    NavigationLink(destination: SkladovaView()) {
                    EmptyView()}
                        .frame(width: 0)
                        .opacity(0)
                }
                    NavigationLink(destination: SpacinceView()) {
                    BuildingCardView(titleString: "Špačince", subtitleString: "Hlavná 6, Špačince", imageString: "spacince", infoString: "FPV, výskumné laboratóriá")}
            }
            .navigationBarTitle(
                Text("Budovy UCM"), displayMode: .large).navigationBarHidden(false)
        }
    }
}
import SwiftUI

struct BuildingCardView: View {

    let titleString: String?
    let subtitleString: String?
    let imageString: String?
    let infoString: String?

    init(titleString: String? = "null", subtitleString: String? = "null", imageString: String? = "default", infoString: String? = "null"){

        self.titleString = titleString
        self.subtitleString = subtitleString
        self.imageString = imageString
        self.infoString = infoString
    }

    var body: some View {
        VStack {
               Image(imageString!)
               .resizable()
               .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: 150, alignment: .topLeading)
               HStack {
                   VStack(alignment: .leading) {
                       Text(titleString!)
                           .font(.title)
                           .fontWeight(.black)
                           .foregroundColor(.primary)
                           .lineLimit(1)
                       Text(subtitleString!)
                           .font(.headline)
                           .foregroundColor(.secondary)
                           .lineLimit(3)
                       Text(infoString!)
                           .font(.subheadline)
                           .foregroundColor(.secondary)
                           .lineLimit(3)
                   }
                   .layoutPriority(100)
                   Spacer()
               }
               .padding()
        }
            .cornerRadius(10)
            .overlay(
                RoundedRectangle(cornerRadius: 10)
                    .stroke(Color(.sRGB, red: 150/255, green: 150/255, blue: 150/255, opacity: 0.2), lineWidth: 1)
            )
    }
}
import SwiftUI

struct ContentView: View {
    var body: some View {
        TabView{
            BuildingsView()
                .tabItem {
                    Image(systemName: "house")
                    Text("Budovy")
            }
            Text("Vyhľadávanie TBD")
                .tabItem {
                    Image(systemName: "magnifyingglass")
                    Text("Vyhľadávanie")
                }
            MapView()
                .tabItem {
                    Image(systemName: "map")
                    Text("Mapa")
            }
        }
    }
}
1
unfortunately you have a lot of code there ...and still not enough. Easiest thing would be to give us a link to github where we can easily download your problem ...or you break down your code in that way, that only a some coding lines reproduce the error. - Chris

1 Answers

0
votes

That should fix at least five problems:
- That your last card looks different
- That the Navigation bar in "inline-mode" does not go to the upper corners of the screen (You can see that on the screenshot)
- That you can click on the borders around the respective cards to open the NavigationLink.
- That the images are stretched
- If you want to use a list anywhere without problems, you can do it now. Before my fix, these lists would no longer have separators.

But please note if you want to change the background color of the ContentView, that my suggestion UIScrollView.appearance().backgroundColor = UIColor(named: "CustomScrollViewBackgroundColor") does not always work correctly. So if you have any problems with that, I can recommend this and this question to you.

import SwiftUI

struct ContentView: View {
    var body: some View {
        TabView {
            NavigationView {
                BuildingsView()
            }
                .tabItem {
                    Image(systemName: "house")
                    Text("Budovy")
                }

            Text("Vyhľadávanie TBD")
                .tabItem {
                    Image(systemName: "magnifyingglass")
                    Text("Vyhľadávanie")
                }
            MapView()
                .tabItem {
                    Image(systemName: "map")
                    Text("Mapa")
                }
        } .edgesIgnoringSafeArea(.top)
    }
}

struct BuildingsView: View {
    var body: some View {
        // UIScrollView.appearance().backgroundColor = UIColor(named: "CustomScrollViewBackgroundColor") // If you want to change the background color

        return ScrollView {
            VStack {
                NavigationLink(destination: NamJHerduView()) {
                    BuildingCardView(titleString: "Námestie J. Herdu", subtitleString: "Námestie J. Herdu 2, Trnava", imageString: "namjherdu", infoString: "Rektorát, FMK, FF, FPV, internáty, jedáleň, kancelárie")
                } .buttonStyle(PlainButtonStyle()) // This is needed because the system considers the content in the NavigationLink as a button. And buttons are colored blue by system default.
                NavigationLink(destination: HajdoczyhoView()) {
                    BuildingCardView(titleString: "Hajdóczyho", subtitleString: "Jána Hajdóczyho 1, Trnava", imageString: "hajdoczy", infoString: "Knižnica, učebne, kancelárie, Kino OKO")
                } .buttonStyle(PlainButtonStyle())
                NavigationLink(destination: BucianskaView()) {
                    BuildingCardView(titleString: "Bučianska", subtitleString: "Bučianska 4A, Trnava", imageString: "bucianska", infoString: "FSV, FMK, aula, kancelárie")
                } .buttonStyle(PlainButtonStyle())
                NavigationLink(destination: VJameView()) {
                    BuildingCardView(titleString: "V Jame", subtitleString: "V Jame 3, Trnava", imageString: "vjame", infoString: "FMK, FSV, jedáleň")
                } .buttonStyle(PlainButtonStyle())
                NavigationLink(destination: SkladovaView()) {
                    BuildingCardView(titleString: "Skladová", subtitleString: "Skladová 3, Trnava", imageString: "skladova", infoString: "FMK")
                } .buttonStyle(PlainButtonStyle())
                NavigationLink(destination: SpacinceView()) {
                    BuildingCardView(titleString: "Špačince", subtitleString: "Hlavná 6, Špačince", imageString: "spacince", infoString: "FPV, výskumné laboratóriá")
                } .buttonStyle(PlainButtonStyle())
            } .padding(.horizontal).padding(.bottom)
        }

        .navigationBarTitle(Text("Budovy UCM"))
    }
}

struct BuildingCardView: View {

    let titleString: String?
    let subtitleString: String?
    let imageString: String?
    let infoString: String?

    init(titleString: String? = "null", subtitleString: String? = "null", imageString: String? = "default", infoString: String? = "null"){

        self.titleString = titleString
        self.subtitleString = subtitleString
        self.imageString = imageString
        self.infoString = infoString
    }

    var body: some View {
        VStack(spacing: 0) {
            Image(imageString!)
                .resizable()
                .aspectRatio(contentMode: .fit) // You should not use frame for resizing the image otherwise it be will stretched
            HStack {
                VStack(alignment: .leading, spacing: 0) {
                    Text(titleString!)
                        .font(.title)
                        .fontWeight(.black)
                        .foregroundColor(.primary)
                        .lineLimit(1)
                    Text(subtitleString!)
                        .font(.headline)
                        .foregroundColor(.secondary)
                        .lineLimit(3)
                    Text(infoString!)
                        .font(.subheadline)
                        .foregroundColor(.secondary)
                        .lineLimit(3)
                }
                .layoutPriority(100)

                Spacer()
            }
            .padding(.all, 16)
            // .background(Color("CustomCardBackgroundColor")) // If you want to change the background color of your cards
        }
        .cornerRadius(10)
        .overlay(
            RoundedRectangle(cornerRadius: 10)
                .stroke(Color(.sRGB, red: 150/255, green: 150/255, blue: 150/255, opacity: 0.2), lineWidth: 1)
        )
    }
}