Ios 在swiftui中重用多个视图的代码/属性

Ios 在swiftui中重用多个视图的代码/属性,ios,swiftui,Ios,Swiftui,我们有几个SwiftUI屏幕,它们显示为工作表。 所有这些都可以通过单击按钮来取消 所以基本上他们都有两个共同点: @Environment(\.presentationMode) var presentationMode func dismiss() { presentationMode.wrappedValue.dismiss() } 如何只声明一次,而只在特定视图中重用它们? 我不能使用继承,因为它们是stucts,扩展不能包含state(使用holder结构除外),并且会将它们

我们有几个SwiftUI屏幕,它们显示为工作表。 所有这些都可以通过单击按钮来取消

所以基本上他们都有两个共同点:

@Environment(\.presentationMode) var presentationMode
func dismiss() {
    presentationMode.wrappedValue.dismiss()
}
如何只声明一次,而只在特定视图中重用它们?
我不能使用继承,因为它们是stucts,扩展不能包含state(使用holder结构除外),并且会将它们添加到相同视图类型的所有实例中。

在当前视图层次结构中,
.presentationMode
是可用的,因此我们可以使用此功能在某些修改器中包装和管理它们

这里是一个基于按钮样式的解决方案演示,因此任何按钮都可以指定为dismissing,它将关闭当前演示

使用Xcode 12.1/iOS 14.1编写


我更改了第一个结构,如下所示
struct TestReuseDismissed:View{@State private var isActive=false var body:some View{Button(“dismise”,action:{//do something before dismise here!!}).buttonStyle(DismissButtonStyle())}
并在导航栏中使用它:
.navigationBarItems(前导:TestReuseDismissed())
。它基本上应该自行关闭,调用了关闭函数,但没有已知的happensIt-导航栏位于不同的视图层次结构中,如果使用自定义视图并将演示文稿用作导航栏项,则其行为相同,但如果使用导航链接目的地中的按钮,则所有操作都有效。您如何知道它位于不同的层次结构中?在哪里可以找到这种文档?
struct TestReuseDismissed: View {
    @State private var isActive = false
    var body: some View {
        Button("Show Sheet") {
            isActive = true
        }
        .sheet(isPresented: $isActive) {
            Button("Dismiss", action: { 
                   // do something before dismiss here !!
                })
                .buttonStyle(DismissButtonStyle())
        }
    }
}

struct DismissButtonStyle: PrimitiveButtonStyle {
    @Environment(\.presentationMode) var presentationMode

    func makeBody(configuration: Configuration) -> some View {
        Button(action: {
            configuration.trigger()
            dismiss()
        }) { configuration.label }
    }

    func dismiss() {
        presentationMode.wrappedValue.dismiss()
    }
}