У меня есть представление, которое в настоящее время отображает список рецептов. У меня есть кнопка для каждого соответствующего рецепта в списке, моя цель — когда пользователь выбирает рецепт, он направляется в другое представление, в котором отображается информация из выбранного элемента.
РецептСписок
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"))
}
}
}
}
}
На этот вопрос уже есть ответ о том, как передавать данные: Передача переменных между представлениями 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())}?
@JimCiaston Мы должны заключить второе представление в скобки, потому что оно содержательное. Подумайте об этом, как о том, что мы не можем просто поместить кнопку в представление; он должен быть внутри тела. Это в основном из-за этого оператора, однако, если вы посмотрите на такие вещи, как Листы, вы заметите, что он также требует переноса квадратных скобок.
аааа, спасибо большое за подробное разъяснение!
Попробуйте заменить
Button
наNavigationLink
; вместо действия просто напишитеRecipeController(...)
.