SwiftUI:.sheet()不';关闭当前工作表时,不要转到具有预期数据的上一个视图

SwiftUI:.sheet()不';关闭当前工作表时,不要转到具有预期数据的上一个视图,swiftui,Swiftui,作为最低要求,我的代码如下所示。在SinglePersonView中,当用户在MovieListView(一个显示演员观看的电影的电影列表)中点击一个电影图像时,它会以工作表模式打开SingleMovieView 这张纸可以作为敲击弹弹出来。但我发现,在关闭工作表并在MovieListView中重新选择其他电影后,该工作表始终作为我上次单击的电影信息(即第一次选择的电影信息)打开。我可以在控制台中看到,电影id始终与第一次相同。我现在没有任何线索,我是否需要对解雇或其他事情进行重新加载操作 在S

作为最低要求,我的代码如下所示。在
SinglePersonView
中,当用户在MovieListView(一个显示演员观看的电影的电影列表)中点击一个电影图像时,它会以工作表模式打开
SingleMovieView

这张纸可以作为敲击弹弹出来。但我发现,在关闭工作表并在
MovieListView
中重新选择其他电影后,该工作表始终作为我上次单击的电影信息(即第一次选择的电影信息)打开。我可以在控制台中看到,
电影id
始终与第一次相同。我现在没有任何线索,我是否需要对解雇或其他事情进行重新加载操作

在SwiftUI的子视图中使用
.sheet()
是正确的方法,还是应该始终将其保留在主体中,在这种情况下,
SinglePersonView

struct SinglePersonView: View {
  var personId = -1
  @ObservedObject var model = MovieListViewModel()

  var body: some View {
    ScrollView() {
      VStack() {
        ...
        MovieListView(movies: model.movies)
        ...
      }
    }.onAppear {
      // json API request
    }
  }
}

struct MovieListView: View {
  var movies: [PersonMovieViewModel]
  @State private var showSheet = false

  ScrollView() {
    HStack() {
      ForEach(movies) { movie in
        VStack() {
          Image(...)
          .onTapGesture {
              self.showSheet.toggle()
          }
          .sheet(isPresented: self.$showSheet) {
              SingleMovieView(movieId: movie.id)
          }
        }
      }
    }
  }
}



视图堆栈中应该只有一个.sheet,但在提供的快照中,有许多同时被激活-实际上,以下行为是不可预测的

这是修正的变体

struct MovieListView: View {
    var movies: [PersonMovieViewModel]
    @State private var showSheet = false
    @State private var selectedID = ""         // type of your movie's ID

    var body: some View {
        ScrollView() {
            HStack() {
                ForEach(movies) { movie in
                    VStack() {
                        Image(...)
                            .onTapGesture {
                                self.selectedID = movie.id
                                self.showSheet.toggle()
                        }
                    }
                }
            }
            .sheet(isPresented: $showSheet) {
                SingleMovieView(movieId: selectedID)
            }
        }
    }
}

视图堆栈中应该只有一个.sheet,但在提供的快照中,有许多同时被激活-实际上,以下行为是不可预测的

这是修正的变体

struct MovieListView: View {
    var movies: [PersonMovieViewModel]
    @State private var showSheet = false
    @State private var selectedID = ""         // type of your movie's ID

    var body: some View {
        ScrollView() {
            HStack() {
                ForEach(movies) { movie in
                    VStack() {
                        Image(...)
                            .onTapGesture {
                                self.selectedID = movie.id
                                self.showSheet.toggle()
                        }
                    }
                }
            }
            .sheet(isPresented: $showSheet) {
                SingleMovieView(movieId: selectedID)
            }
        }
    }
}

哦我应该将
.sheet
放在
ForEach
循环之外,并将循环中的id分配给
State
属性。这解决了我的代码问题,谢谢!我发现我可以将
.sheet
放在scrollView之后并获得相同的效果,那么将
.sheet
放在Stack View或Scroll View之后有什么不同吗?当然,我还更改了问题标题以与问题对齐。哦!我应该将
.sheet
放在
ForEach
循环之外,并将循环中的id分配给
State
属性。这解决了我的代码问题,谢谢!我发现我可以将
.sheet
放在scrollView之后并获得相同的效果,那么将
.sheet
放在Stack View或Scroll View之后有什么不同吗?当然,我还更改了问题标题以与问题对齐。