Отображение данных из одного представления в другом представлении

У меня есть представление, которое в настоящее время отображает список рецептов. У меня есть кнопка для каждого соответствующего рецепта в списке, моя цель — когда пользователь выбирает рецепт, он направляется в другое представление, в котором отображается информация из выбранного элемента.

РецептСписок

struct RecipeListView: View {
    var listofRecipes: [RecipeListModel] = RecipeList.recipes
  
    init(){
        UITableView.appearance().backgroundColor = .clear
    }
    var body: some View {
        NavigationView{
        VStack{
            Text("Recipes")
                .padding(.top, 40)
                .font(.title2)
            List(listofRecipes, id: \.id){ recipe in
                HStack{
                    Image(recipe.image)
                        .resizable()
                       .frame (width: 70, height:70)
                        .cornerRadius(15)
                        
                    VStack{
                        Text(recipe.name)
                            .font(.title3)
                        
                        Button(action: {
                           //action
                        }){
                            Text("View Recipe")
                                .font(.body)
                                .foregroundColor(.white)
                                .frame(width:120, height:30)
                                .background(Color("completeGreen"))
                        }
                    } .padding(.leading, 40)
                }
            }
            
        }
    }
    }
}

Представление рецептов — здесь будет отображаться рецепт, выбранный в предыдущем представлении.

struct RecipeController: View {
    @State var recipeEdit = true

    var recipeList = RecipeList.recipes
    var body: some View {
        NavigationView{
        VStack{
            Text("will display recipe.name of clicked value in recipe list view") 
            RecipeEntryPicture()
            RecipeIngredients(isEditing: $recipeEdit)
        }
        .toolbar{
            ToolbarItem(placement: .bottomBar){
                    Button(action: {
                        recipeEdit.toggle()
                    }){
                        HStack{
                        Image(systemName: "pencil.circle").foregroundColor(.black)
                            Text(recipeEdit ? "Edit" : "Complete")
                            .foregroundColor(.black)
                        }
                        .font(.title)
                    }
                    .edgesIgnoringSafeArea(.all)
                    .frame(maxWidth: .infinity)
                    .frame(height: 60)
                    .background(Color(recipeEdit ? "spaceGray" : "completeGreen"))
                    
                }
            }
        }
      }
    }

Попробуйте заменить Button на NavigationLink; вместо действия просто напишите RecipeController(...).

HunterLion 19.03.2022 16:17
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
39
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На этот вопрос уже есть ответ о том, как передавать данные: Передача переменных между представлениями SwiftUI.

Однако вы также можете сделать кнопку NavigationLink (как предложил Hunter Lion выше). Затем вы можете запросить данные из первого представления, например следующий код.

struct FirstView: View {

var body: some View{

  NavigationLink(destination: {SecondView(name: "Name", date: Date())}, label: {
            
            Text("Click here to advance")
        })
    }

}

}

И код для SecondView:


struct SecondView: View{
var name: String
var date: Date
var body: some View{

VStack{

Text(name)
DatePicker("Select a Date", selection: $date)

}

}

}

Спасибо за предоставленный ответ. Быстрый вопрос, почему мы заключаем второе представление в скобки {SecondView(name: "Name", date: Date())}?

Jim Ciaston 20.03.2022 22:03

@JimCiaston Мы должны заключить второе представление в скобки, потому что оно содержательное. Подумайте об этом, как о том, что мы не можем просто поместить кнопку в представление; он должен быть внутри тела. Это в основном из-за этого оператора, однако, если вы посмотрите на такие вещи, как Листы, вы заметите, что он также требует переноса квадратных скобок.

Mr Developer 21.03.2022 15:06

аааа, спасибо большое за подробное разъяснение!

Jim Ciaston 21.03.2022 20:54

Другие вопросы по теме