【问题标题】:Swiftui how to refresh parent view when child view closes on disappearSwiftui如何在子视图关闭时刷新父视图消失
【发布时间】:2021-03-14 21:19:05
【问题描述】:

我有一个名为 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!
        }
       }

}

【问题讨论】:

  • 很难弄清楚代码中发生了什么。您使用名为 placeEnum 的参数调用 PlacePickerView(placeEnum: placeEnum),但 PlacePickerView 没有名为该参数的属性。一般而言,我认为您想研究 @Binding 的作用——这是在子视图和父视图之间提供双向通信的一种方式。
  • 我刚刚删除了它,我的视图也做了其他事情,但想在这个例子中简化它。我将研究绑定,看看它是否能解决问题。
  • 绑定的documentation 显示了一个非常简单的示例。

标签: swift swiftui


【解决方案1】:
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 是一个结构体。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 2021-07-08
    • 2020-09-07
    • 2020-06-04
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多