首页 > 解决方案 > Swiftui如何在子视图关闭时刷新父视图消失

问题描述

我有一个名为 PostView 的父视图,它有一个 PlaceData 状态变量,它只包含一个空字符串。当您单击图像后置位时,它将转到子视图 PlacePickerView 。该视图将具有来自数据库的动态数据。当您在该子视图中点击 Text model.PlaceName时,该子视图将关闭,我们将返回父视图。我要做的是将子视图 (PlacePickerView) 中的 model.PlaceName 的值传递给父视图 (PostView) 中的 PlaceData。问题是在子视图中我正在使用 @Environment(.presentationMode) var presentationMode(因为父视图可能包含更多数据,我不想通过创建新实例而丢失它)关闭该视图并且似乎无法将数据传递回父视图。任何帮助或建议都会很棒。

struct PostView: View {
   @State var PlaceState = false
   @State var PlaceData = ""

    var body: some View {
    VStack {

            Text(PlaceData)
            .foregroundColor(.white)
            .font(.system(size: 17))
            .fontWeight(.medium)
            .padding(.bottom, 20.0)
          
              Image("postplace")
              .resizable()
              .frame(width: 24, height: 24)
              .padding(.top, 5.0)
              .onTapGesture {
               self.PlaceState.toggle()
               }.fullScreenCover(isPresented: $PlaceState, content: {
                 PlacePickerView()
                               
                            })
                }
            }
}

子视图

struct PlacePickerView: View {
    @Environment(\.presentationMode) var presentationMode
    @State var model: MainModel?
    @State var tappedText1 = false

  var body: some View {
        VStack {
            Text(model.PlaceName) // I would like to pass value of model.PlaceName to PostView PlaceData on  when model on tapped is clicked here
                .font(.system(size: 11))
                .fontWeight(.semibold)
                .frame(width: 106, height: 40)
                .foregroundColor(.white)
                .background(RoundedRectangle(cornerRadius: 4).stroke())
                .background(Color(UIColor(hexString: "#800000")))
                .onTapGesture {
                    tappedText1.toggle()
                        self.presentationMode.wrappedValue.dismiss()
                }
         }  MainViewModel().MainViewRequest(newValue) { data in
            self.model = data!
        }
       }

}

标签: swiftswiftui

解决方案


struct PostView: View {
   @State var PlaceState = false
   @State var PlaceData = ""
   @State var model: MainModel?
PlacePickerView(model: $model)
struct PlacePickerView: View {
  @Binding var model: MainModel?

这是您希望与绑定一起使用的一般概念——父级拥有它,并且它被传递给子视图$(使其成为绑定)。子视图将其用作@Binding而不是@State.

顺便说一句,我在这里假设这MainModel是一个结构。

当状态/绑定值更改时,您的父视图将自动重新呈现。


推荐阅读