首页 > 解决方案 > 如何在 SwiftUI 中实现类似 onAppear 的功能?

问题描述

所以,我想创建一个自定义视图并添加功能。我怎样才能实现这样的功能.onAppear(perform: (() -> Void)?)?我的代码不起作用,onDismiss闭包不调用DashboardView.

struct DashboardView: View {

  @State var employees = ["Alex", "Olga", "Mark"]
  @State var presentEmployeeView = false

  var body: some View {
    NavigationView {
      List {
        Section {
          Button(action: {
            self.presentEmployeeView = true
          }, label: {
            Text("All employees")
          }).buttonStyle(BorderlessButtonStyle())
        }
      }
    }
    .sheet(isPresented: $presentEmployeeView) {
      EmployeesView(employees: self.employees).onDismiss {
        self.presentEmployeeView = false
      }
    }
  }
}

struct EmployeesView: View {
  let employees: [String]

  @State private var onDismissClosure: (() -> Void)? = nil
  func onDismiss(perform action: (() -> Void)? = nil) -> some View {
    self.onDismissClosure = action
    return self
  }

  var body: some View {
    NavigationView {
      List {
        ForEach(employees) { employee in
          EmployeeCell(employee: employee)
        }
      }.navigationBarItems(leading:
        Button(action: {
          self.onDismissClosure?()
        }, label: {
          Text("Close")
       })
      )
    }
  }
}

标签: iosswiftstructclosuresswiftui

解决方案


这是可能的方法。测试并使用 Xcode 11.4 / iOS 13.4

struct DashboardView: View {

  @State var employees = ["Alex", "Olga", "Mark"]
  @State var presentEmployeeView = false

  var body: some View {
    NavigationView {
      List {
        Section {
          Button(action: {
            self.presentEmployeeView = true
          }, label: {
            Text("All employees")
          }).buttonStyle(BorderlessButtonStyle())
        }
      }
    }
    .sheet(isPresented: $presentEmployeeView) {
      EmployeesView(employees: self.employees) {
        self.presentEmployeeView = false
      }
    }
  }
}

struct EmployeesView: View {
  let employees: [String]
  var onDismiss = {}

  var body: some View {
    NavigationView {
      List {
        ForEach(employees, id: \.self) { employee in
          Text("\(employee)")
        }
      }.navigationBarItems(leading:
        Button(action: {
          self.onDismiss()
        }, label: {
          Text("Close")
       })
      )
    }
  }
}

更新:与修饰符一起使用的可能替代方法:

    ...
    .sheet(isPresented: $presentEmployeeView) {
      EmployeesView(employees: self.employees).onDismiss {
        self.presentEmployeeView = false
      }
    }
  }
}

struct EmployeesView: View {
  let employees: [String]
  var onDismiss = {}

  func onDismiss(_ callback: @escaping () -> ()) -> some View {
    EmployeesView(employees: employees, onDismiss: callback)
  }

  var body: some View {
    NavigationView {
      List {
        ForEach(employees, id: \.self) { employee in
          Text("\(employee)")
        }
      }.navigationBarItems(leading:
        Button(action: {
          self.onDismiss()
        }, label: {
          Text("Close")
       })
      )
    }
  }
}

推荐阅读