ForEach 内的工作表不会遍历项目 SwiftUI

xme*_*tal 12 foreach swift 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])
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Asp*_*eri 17

应该只有一个工作表,所以这是可能的方法 - 使用另一个工作表修改器并通过选择激活它

使用 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])
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 当您在 ForEach 中添加 .sheet 修饰符时,您会添加许多工作表(每行一个)连接到一个此状态,因此切换一个状态会激活*所有*工作表,这会导致不可预测的行为。您需要一张表和一个选定的项目,可以按索引或直接按项目 - 这是根据偏好。 (2认同)

Jos*_*iva 7

我将您的代码更改为只有一张纸,并将选定的电影放在一个变量中。

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)
            })
        }
    }
}
Run Code Online (Sandbox Code Playgroud)