[英]Sheet inside ForEach doesn't loop over items SwiftUI
我在 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])
}
}
}
}
}
}
應該只有一個工作表,所以這是可能的方法 - 使用另一個工作表修飾符並通過選擇激活它
使用 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])
}
}
}
}
我將您的代碼更改為只有一張紙,並將所選電影放在一個變量中。
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)
})
}
}
}
想在這件事上給我 2 美分。 我遇到了同樣的問題,Asperi 的解決方案對我有用。 但是 - 我還想在表單上有一個按鈕來關閉模式。
當您使用isPresented
調用工作sheet
時,您傳遞了一個綁定 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")
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.