ForEach中的工作表不会循环显示项目SwiftUI

时间:2020-07-25 13:24:23

标签: swift foreach 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])
                    }
                }
            }
        }
    }
}

3 个答案:

答案 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)
            })
        }
    }
}