Как перейти к подробному экрану с помощью навигационной ссылки, содержащей ZStack с некоторым макетом - PullRequest
1 голос
/ 17 января 2020

Я создаю приложение для рецептов и строю его следующим образом: во-первых, я создал в отдельной структуре базовый c вид с Image в качестве фона и некоторым текстом сверху. затем я создал несколько горизонтальных ScrollViews, в которые встроил вид этих базовых c видов. Я хочу, чтобы, когда пользователь нажимал на одно из этих представлений, он go отображал подробный экран на основе своего выбора. Для этого я встроил весь код представления с изображением и текстом внутри navigationLink. но когда я запускаю приложение в симуляторе и нажимаю на одно из представлений, ничего не происходит.

это код представления с текстом и изображением:

NavigationLink(destination: DetailView(title: titleText)) {
            ZStack {
                Image(foodImageName)
                    .resizable()
                    .renderingMode(.original)

                VStack {
                    Text(titleText)
                        .foregroundColor(Color.init(hex: "AAAAAA"))
                        .font(.system(size: 30, weight: .semibold))
                    Spacer()
                }
            }
            .frame(width: 189, height: 194)
            .cornerRadius(15)
            .shadow(color: Color.init(hex:"000000"), radius: 7,x: 7, y: 7)
        }

и это код основного вида:

struct ContentView: View {

    private var spacing: CGFloat = 20
    var body: some View {
        NavigationView {
            VStack {
                Text("First Course")
                    .frame(height: 36)
                    .font(.system(size: 25, weight: .semibold))

                ScrollView (Axis.Set.horizontal, showsIndicators: false){
                    HStack{
                        MenuTopicView(titleText: "Soup", foodImageName: "Soup")
                        MenuTopicView(titleText: "Fish", foodImageName: "Soup")
                    }
                }.frame(height: 200)

                Text("Main Course")
                    .frame(height: 36)
                    .font(.system(size: 25, weight: .semibold))

                ScrollView(Axis.Set.horizontal) {
                    HStack {
                        MenuTopicView(titleText: "Steak", foodImageName: "Soup")
                        MenuTopicView(titleText: "Chicken", foodImageName: "Soup")
                    }
                }

                Text("Dessert")
                    .frame(height: 36)
                    .font(.system(size: 25, weight: .semibold))

                ScrollView(Axis.Set.horizontal) {
                    HStack {
                        MenuTopicView(titleText: "Ice cream", foodImageName: "Soup")
                        MenuTopicView(titleText: "Pancakes", foodImageName: "Soup")
                    }
                }
            }
        .navigationBarTitle("Recipes")
        }
    }

}

Кто-нибудь есть предложение о том, что я сделал не так? спасибо!

Ответы [ 3 ]

0 голосов
/ 20 января 2020

@ eatyourpotato Это код, который у меня есть, это было слишком долго для комментария, поэтому вот оно:

    var body: some View {
        NavigationView {

            NavigationLink(destination: RecipeView(recipeName: titleText)) {
                ZStack {
                    Image(foodImageName)
                        .resizable()
                        .renderingMode(.original)

                    VStack {
                        Text(titleText)
                            .foregroundColor(Color.init(hex: "AAAAAA"))
                            .font(.system(size: 30, weight: .semibold))
                        Spacer()
                    }
                }
                .frame(width: 189, height: 194)
                .cornerRadius(15)
                .shadow(color: Color.init(hex:"000000"), radius: 7,x: 7, y: 7)
            }
        }
    }
0 голосов
/ 21 января 2020

Вы должны обернуть каждый MenuTopicView в отдельную NavigationLink и добавить его в свой ContentView, чтобы он работал, потому что у них всех есть свои отдельные пункты назначения. Вот так:

            ScrollView (Axis.Set.horizontal, showsIndicators: false){
                HStack{
                    NavigationLink(destination: DetailView("Soup")) {
                        MenuTopicView(titleText: "Soup", foodImageName: "Soup")
                    }
                    NavigationLink(destination: DetailView("Fish")) {
                        MenuTopicView(titleText: "Fish", foodImageName: "Soup")
                    }
                }
            }.frame(height: 200)

Я бы посоветовал сделать больше общих c просмотров, чтобы вам не пришлось повторяться. Как то так:

struct ContentView: View {
    let sections: [MenuSection]

    private var spacing: CGFloat = 20
    var body: some View {
        NavigationView {
            VStack {
                ForEach(sections, id: \.self) { section in
                    MenuSectionView(sectionTitle: section.title, items: section.items)
                }

            }
            .navigationBarTitle("Recipes")
        }
    }
}

struct MenuSectionView: View {
    let sectionTitle: String
    let items: [MenuItem]

    var body: some View {
        VStack {
            Text(sectionTitle)
                .frame(height: 36)
                .font(.system(size: 25, weight: .semibold))
            ScrollView (Axis.Set.horizontal, showsIndicators: false) {
                HStack {
                    ForEach(items, id: \.self) { item in
                        NavigationLink(destination: RecipeView(recipeName: item.title)) {
                            MenuTopicView(titleText: item.title, foodImageName: item.image)
                        }
                    }
                }
            }.frame(height: 200)
        }
    }
}
0 голосов
/ 18 января 2020

Я вижу, что ваш основной вид обернут в NavigationView, но ни один из элементов в VStack не находится в NavigationLink. Вы можете попробовать это:

NavigationView {
    VStack {
        NavigationLink(destination: DetailView(title: titletext) {
            Text("First Course")
                .frame(height: 36)
                .font(.system(size: 25, weight: .semibold))

            ScrollView (Axis.Set.horizontal, showsIndicators: false){
                HStack{
                    MenuTopicView(titleText: "Soup", foodImageName: "Soup")
                    MenuTopicView(titleText: "Fish", foodImageName: "Soup")
                }
            }.frame(height: 200)
        }
    }
}

Чтобы NavigationLink работал, он должен быть встроен в NavigationView.

...