假设您的Item 有一个结构,您需要将其与Identifiable 保持一致:
struct Item: Identifiable {
var id: String { name } // needed for `Identifiable`
let name: String
let imageName: String
let description: String
}
然后在你的主视图中:
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 ImageView: View {
let imageName: String
var body: some View {
Image(systemName: imageName)
}
}
您可以为您的项目创建详细视图(包含项目描述等):
struct DetailView: View {
let item: Item
var body: some View {
VStack {
Text(item.name)
Image(systemName: item.imageName)
Text(item.description)
}
}
}
编辑
这是使用相同视图显示图像或带有描述的图像的不同方法:
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 DetailView: View {
@State var showDescription = false
let item: Item
var body: some View {
VStack {
Text(item.name)
Image(systemName: item.imageName)
if showDescription {
Text(item.description)
}
}
.onTapGesture {
self.showDescription.toggle()
}
}
}
并将Item 与Hashable 一致:
struct Item: Hashable
或代替:
ForEach(items, id: \.self)
明确指定id:
ForEach(items, id: \.name)