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