onDismiss 就足够了,你只需要添加另一个变量并检查它。
例如:
让我们声明一个enum
enum SheetAction {
case cancel
case nothing
}
然后在您的主视图中:
@State var sheetAction: SheetAction = SheetAction.nothing
就像导致关闭的默认action 将是nothing,这意味着向下滑动,而不是按钮。
并将其传递给您的SheetView
.sheet(isPresented: self.$sheetActive, onDismiss: {
if sheetAction == .cancel {
// dismissed using cancel button
dismissTxt = "Cancel"
}else if sheetAction == .nothing {
// dismissed by swipe down
dismissTxt = "Swipe down"
}
}, content: {
SheetView(isActive: self.$sheetActive, action: self.$sheetAction)
})
当用户点击Cancel按钮时,改变它的值。
并且不要错过每次出现SheetView 时将值更改为nothing。
最终代码:
enum SheetAction {
case cancel
case nothing
}
struct CustomView: View {
@State var sheetActive = false
@State var sheetAction: SheetAction = SheetAction.nothing
@State var dismissTxt = ""
var body: some View {
VStack {
Text(dismissTxt).foregroundColor(.gray)
Button(action: {
self.sheetActive = true
}, label: {
Text("Button")
})
}.sheet(isPresented: self.$sheetActive, onDismiss: {
if sheetAction == .cancel {
// dismissed using cancel button
dismissTxt = "Cancel"
}else if sheetAction == .nothing {
// dismissed by swipe down
dismissTxt = "Swipe down"
}
}, content: {
SheetView(isActive: self.$sheetActive, action: self.$sheetAction)
})
}
}
struct SheetView: View {
@Binding var isActive: Bool
@Binding var action: SheetAction
var body: some View {
NavigationView {
VStack {
Text("Sheet content")
}
.navigationBarItems(leading: Button(action: {
// Code that dismisses sheet
self.action = .cancel
self.isActive = false
}) {
Text("Cancel")
}, trailing: Button(action: {
// Code that adds something to something
}) {
Text("Add").bold()
})
}.onAppear {
action = .nothing
}
}
}