View SwiftUI OnTap手势显示新视图

View SwiftUI OnTap手势显示新视图,view,swiftui,View,Swiftui,我正在使用SwiftUI制作自己的比萨饼递送应用程序。我现在被卡住了,因为我不知道如何显示与他自己的数组索引相关的相同图像视图(包括比萨饼的描述)。我希望每次用户点击数组中的图像时,它都会显示带有简短文本描述的相同图像,而不是行{self.images print(“ok”)}。对我的问题的描述是否足够清楚?如果有人能帮我解决这个问题,我将不胜感激。非常感谢您的阅读。代码如下: HStack { ForEach(images, id: \.id) { post in Fo

我正在使用SwiftUI制作自己的比萨饼递送应用程序。我现在被卡住了,因为我不知道如何显示与他自己的数组索引相关的相同图像视图(包括比萨饼的描述)。我希望每次用户点击数组中的图像时,它都会显示带有简短文本描述的相同图像,而不是行
{self.images print(“ok”)}
。对我的问题的描述是否足够清楚?如果有人能帮我解决这个问题,我将不胜感激。非常感谢您的阅读。代码如下:

HStack {
    ForEach(images, id: \.id) { post in
        ForEach(0..<1) { _ in
            ImageView(postImages: post)
        }
    }
    Spacer()
}
.onTapGesture {
    self.images
    print("ok")
}
.navigationBarTitle("Choose your Pizza")
.padding()
HStack{
ForEach(图像,id:\.id){post-in

ForEach(0..假设您的
项有一个结构
,则需要将其与
可识别的

struct Item: Identifiable {
    var id: String { name } // needed for `Identifiable`

    let name: String
    let imageName: String
    let description: String
}
struct Item: Hashable
那么在你的主要观点中:

struct ContentView: View {
    let items = [
        Item(name: "item1", imageName: "circle", description: "some description of item 1"),
        Item(name: "item2", imageName: "circle", description: "some description of item 2"),
        Item(name: "item3", imageName: "circle", description: "some description of item 3"),
    ]

    @State var selectedItem: Item? // <- track the selected item

    var body: some View {
        NavigationView {
            HStack {
                ForEach(items, id: \.id) { item in
                    ImageView(imageName: item.imageName)
                        .onTapGesture { 
                            self.selectedItem = item // select the tapped item
                        }
                }
                Spacer()
            }
            .navigationBarTitle("Choose your Pizza")
            .padding()
        }
        .sheet(item: $selectedItem) { item in // show a new sheet if selectedItem is not `nil`
            DetailView(item: item)
        }
    }
}
您可以为项目创建详细视图(带有项目说明等):

编辑

以下是使用相同视图显示图像或图像及其描述的不同方法:

struct ContentView: View {
    @State var items = [
        Item(name: "item1", imageName: "circle", description: "some description of item 1"),
        Item(name: "item2", imageName: "circle", description: "some description of item 2"),
        Item(name: "item3", imageName: "circle", description: "some description of item 3"),
    ]

    var body: some View {
        NavigationView {
            HStack {
                ForEach(items, id: \.self) { item in
                    DetailView(item: item)
                }
                Spacer()
            }
            .navigationBarTitle("Choose your Pizza")
            .padding()
        }
    }
}
并将
符合
哈希表

struct Item: Identifiable {
    var id: String { name } // needed for `Identifiable`

    let name: String
    let imageName: String
    let description: String
}
struct Item: Hashable
或者代替:

ForEach(items, id: \.self)
明确指定
id

ForEach(items, id: \.name)

我也尝试了一下,为了它的价值

(顺便说一句,pawello2222的答案也是100%正确的。实现您所描述的目标有多种方法)

我首先创建了一个比萨饼菜单(使用占位符图像):

从菜单中选择一个项目后,您将看到所选的比萨饼详情:

我正在使用
NavigationView
NavigationLink
在视图之间导航

以下是完整的源代码(为了在Swift操场上获得最佳运行效果):


导入PlaygroundSupport//仅用于在Swift游乐场跑步
导入快捷键
//主比萨饼列表页面(视图)
结构PizzaList:视图{
//比萨饼图像数组
让Pizza图像=[
图像(系统名称:“circle.fill”),
图像(系统名称:“square.fill”),
图像(系统名称:“三角形填充”)
]
//比萨饼描述数组
让比萨饼描述=[
“圆形比萨饼”,
“方形比萨饼”,
“三角披萨”
]
var body:一些观点{
//在导航视图中换行,以便能够在“页面”之间切换
导航视图{
VStack{
ForEach(0..
您的问题还不够清楚-您希望如何显示新视图?作为一张图纸,带有导航链接…?当触发“.ontap手势”时,我希望阵列中的每个图像在完全相同的页面上显示相同的图像。我知道我必须使用“位置属性”但是我不知道怎么做。请提供帮助?所以你有一组图像(开头没有描述)当用户点击一个特定的图像时,你想用它的描述来显示这个图像,还是我遗漏了什么?是的,这正是我想做的!有什么想法吗?你想让它显示为现有图像数组上的一个新窗口吗?还是只向所选图像添加一个描述行?而不是两个sepa速率阵列(比萨图像、比萨描述)最好是创建一个将所有内容都放在一起的结构。使用单独的数组,处理索引是有风险的-在添加新图像时,您可能很容易忘记添加描述。而且您只检查
pizzaImages.count
-如果
pizzaDescriptions.count
更小怎么办?非常感谢您的贡献。谢谢非常感谢您的贡献!不幸的是,这不是我想要做的。因为一旦点击图像,我不知道会打开什么新窗口。我希望它在完全相同的页面中显示相同的图像(与其自身的数组索引相关),并带有简短的文本描述。因此,基本上,我知道我必须使用“位置属性”在“OnTap手势”括号中。但是非常感谢您的回答。非常感谢您的贡献!不幸的是,这不是我想要的
ForEach(items, id: \.name)