簡體   English   中英

ForEach 內的工作表不會遍歷項目 SwiftUI

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM