我在ForEach内使用工作表时遇到问题。基本上,我有一个列表,该列表显示我的数组中的许多项目以及一个触发工作表的图像。问题在于,在显示我的工作表时,它仅显示我数组的第一项,在这种情况下为“哈利·波特”。
这是代码
struct ContentView: View {
@State private var showingSheet = false
var movies = ["Harry potter", "Mad Max", "Oblivion", "Memento"]
var body: some View {
NavigationView {
List {
ForEach(0 ..< movies.count) { movie in
HStack {
Text(self.movies[movie])
Image(systemName: "heart")
}
.onTapGesture {
self.showingSheet = true
}
.sheet(isPresented: self.$showingSheet) {
Text(self.movies[movie])
}
}
}
}
}
}
答案 0 :(得分:9)
应该只有一张纸,因此这是可行的方法-使用另一张纸修改器并通过选择激活它
通过Xcode 12 / iOS 14(与iOS 13兼容)进行测试
extension Int: Identifiable {
public var id: Int { self }
}
struct ContentView: View {
@State private var selectedMovie: Int? = nil
var movies = ["Harry potter", "Mad Max", "Oblivion", "Memento"]
var body: some View {
NavigationView {
List {
ForEach(0 ..< movies.count) { movie in
HStack {
Text(self.movies[movie])
Image(systemName: "heart")
}
.onTapGesture {
self.selectedMovie = movie
}
}
}
.sheet(item: self.$selectedMovie) {
Text(self.movies[$0])
}
}
}
}
答案 1 :(得分:1)
想在这件事上给我 2 美分。 我遇到了同样的问题,Asperi 的解决方案对我有用。 但是 - 我还想在工作表上有一个按钮来关闭模态。
当您使用 sheet
调用 isPresented
时,您传递了一个绑定 Bool,因此您将其更改为 false
以关闭。
我在 item
案例中所做的是将项目作为绑定传递。在工作表中,我将该装订项目更改为 nil
并取消了工作表。
例如在这种情况下,代码将是:
var movies = ["Harry potter", "Mad Max", "Oblivion", "Memento"]
var body: some View {
NavigationView {
List {
ForEach(0 ..< movies.count) { movie in
HStack {
Text(self.movies[movie])
Image(systemName: "heart")
}
.onTapGesture {
self.selectedMovie = movie
}
}
}
.sheet(item: self.$selectedMovie) {
Text(self.movies[$0])
// My addition here: a "Done" button that dismisses the sheet
Button {
selectedMovie = nil
} label: {
Text("Done")
}
}
}
}
答案 2 :(得分:0)
我将您的代码更改为只有一张纸,并且将选定的电影放在一个变量中。
extension String: Identifiable {
public var id: String { self }
}
struct ContentView: View {
@State private var selectedMovie: String? = nil
var movies = ["Harry potter", "Mad Max", "Oblivion", "Memento"]
var body: some View {
NavigationView {
List {
ForEach(movies) { movie in
HStack {
Text(movie)
Image(systemName: "heart")
}
.onTapGesture {
self.selectedMovie = movie
}
}
}
.sheet(item: self.$selectedMovie, content: { selectedMovie in
Text(selectedMovie)
})
}
}
}