ios - 如何在 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")
})
)
}
}
}
解决方案
这是可能的方法。测试并使用 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")
})
)
}
}
}
推荐阅读
- ruby-on-rails - Rails-在创建操作期间根据表单输入重定向到不同的路径
- laravel - 登录后 DevTools 无法解析 SourceMap 错误将重定向到该 js 文件
- html - 单击其中一项后,ngbdropdown 菜单未关闭
- excel - 寻找识别单元格中不同数字的公式
- python - ModuleNotFoundError:没有名为“folium.plugins”的模块;'folium' 不是一个包
- ruby - 将 `any?` 和 `include?` 的结果推送到数组中
- azure-devops - Teamcity 无法从 Azure Devops 获取文件
- c# - 构建代理需求的问题未针对 android 构建进行验证
- xpages - 编辑文档,另存为新文档
- python - 嵌套列表迭代