Ugo*_*ino 27 modal-dialog swift swiftui
由于SwiftUI是声明性的,因此没有dismiss
方法。如何在上添加一个关闭/关闭按钮DetailView
?
struct DetailView: View {
var body: some View {
Text("Detail")
}
}
struct ContentView : View {
var body: some View {
PresentationButton(Text("Click to show"), destination: DetailView())
}
}
Run Code Online (Sandbox Code Playgroud)
Mo *_*ani 40
您可以presentationMode
在模态视图中使用环境变量并调用self.presentaionMode.wrappedValue.dismiss()
以消除模态:
struct ContentView: View {
@State private var showModal = false
var body: some View {
Button(action: {
self.showModal = true
}) {
Text("Show modal")
}.sheet(isPresented: self.$showModal) {
ModalView()
}
}
}
struct ModalView: View {
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
var body: some View {
Group {
Text("Modal view")
Button(action: {
self.presentationMode.wrappedValue.dismiss()
}) {
Text("Dismiss")
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
thi*_*ezn 27
在 Xcode Beta 5 中,另一种方法是在启动模态的视图中使用 @State,并在模态视图中添加绑定以控制模态的可见性。这不需要您进入@EnvironmentpresentationMode 变量。
struct MyView : View {
@State var modalIsPresented = false
var body: some View {
Button(action: {self.modalIsPresented = true}) {
Text("Launch modal view")
}
.sheet(isPresented: $modalIsPresented, content: {
MyModalView(isPresented: self.$modalIsPresented)
})
}
}
struct MyModalView : View {
@Binding var isPresented: Bool
var body: some View {
Button(action: {self.isPresented = false}) {
Text("Close modal view")
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 13
这是一种消除呈现视图的方法。
struct DetailView: View {
@Binding
var dismissFlag: Bool
var body: some View {
Group {
Text("Detail")
Button(action: {
self.dismissFlag.toggle()
}) {
Text("Dismiss")
}
}
}
}
struct ContentView : View {
@State var dismissFlag = false
var body: some View {
Button(action: {
self.dismissFlag.toggle()
})
{ Text("Show") }
.presentation(!dismissFlag ? nil :
Modal(DetailView(dismissFlag: $dismissFlag)) {
print("dismissed")
})
}
}
Run Code Online (Sandbox Code Playgroud)
Swift 5.5 和 SwiftUI 3 中的新增功能:
@Environment(\.dismiss) var dismiss
Run Code Online (Sandbox Code Playgroud)
然后在函数或主体代码中的某个位置,只需调用:
self.dismiss()
Run Code Online (Sandbox Code Playgroud)
似乎对于Xcode 11 Beta 7(在Xcode的版本11M392r上)来说,它略有不同。
@Environment(\.presentationMode) var presentation
Button(action: { self.presentation.wrappedValue.dismiss() }) { Text("Dismiss") }
Run Code Online (Sandbox Code Playgroud)
小智 7
您可以实现这一点。
struct view: View {
@Environment(\.isPresented) private var isPresented
private func dismiss() {
isPresented?.value = false
}
}
Run Code Online (Sandbox Code Playgroud)
Beta 5中现在有一种非常干净的方法来执行此操作。
import SwiftUI
struct ModalView : View {
// In Xcode 11 beta 5, 'isPresented' is deprecated use 'presentationMode' instead
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
var body: some View {
Group {
Text("Modal view")
Button(action: { self.presentationMode.wrappedValue.dismiss() }) { Text("Dismiss") }
}
}
}
struct ContentView : View {
@State var showModal: Bool = false
var body: some View {
Group {
Button(action: { self.showModal = true }) { Text("Show modal via .sheet modifier") }
.sheet(isPresented: $showModal, onDismiss: { print("In DetailView onDismiss.") }) { ModalView() }
}
}
}
Run Code Online (Sandbox Code Playgroud)
Navigation
则自动关闭Modal
只需presentationMode
从目标视图中的环境中dismiss
获取wrappedValue
:
struct DestinationView: View {
@Environment(\.presentationMode) private var presentationMode
var body: some View {
Button("Dismiss") {
self.presentationMode.wrappedValue.dismiss()
}
}
}
Run Code Online (Sandbox Code Playgroud)
而不是presentationMode
我们现在可以使用DismissAction
.
这是文档中的一个示例:
struct SheetView: View {
@Environment(\.dismiss) var dismiss
var body: some View {
NavigationView {
SheetContents()
.toolbar {
Button("Done") {
dismiss()
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8731 次 |
最近记录: |