ios - 如何在 SwiftUI 中实现类似 onAppear 的功能?

标签 ios swift struct closures swiftui

所以,我想创建一个自定义 View 并添加功能。如何实现 .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")
       })
      )
    }
  }
}

最佳答案

这是可能的方法。测试并使用 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")
       })
      )
    }
  }
}

关于ios - 如何在 SwiftUI 中实现类似 onAppear 的功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61039657/

相关文章:

Swift 结构扩展 : 'Cannot convert return expression of type <type> to return type <type>'

ios - 将数据从结构数组传递到新的 TableView Controller

ios - 在 IB 中将类分配给 VC 会导致黑屏

ios - 我们如何从 iphone(在我的应用程序中)的设置中禁用已启用 "bold text"的效果? - swift 2.0

ios - 异步加载数据到 UITableView

swift - swift 从另一个类访问navigationBarController

C分数算术

ios - 在 iOS 15 上实现消息 - 与你共享功能

ios - 我如何使用 UIScrollView 来适应图像的缩放部分?

ios - 在 swift ios 中更新文本字段 ui