所以我有一张表格,左侧有一个取消按钮,右侧有一个完成按钮,如下所示:
.navigationBarItems(leading: Button(action: {
// Code that dismisses sheet
}) {
Text("Cancel")
}, trailing: Button(action: {
// Code that adds something to something
}) {
Text("Add").bold()
})
Run Code Online (Sandbox Code Playgroud)
我想要做的是当我的 SwiftUI“工作表”被滑开(向下)时执行一段代码。这不适用于onDismissor onDisappear,因为它们都会在按下任何按钮以及将其滑开时执行。
是否有可能做到这一点?
Oua*_*lal 20
onDismiss就足够了,您只需添加另一个变量并检查它。
例如:让我们声明一个enum
enum SheetAction {
case cancel
case nothing
}
Run Code Online (Sandbox Code Playgroud)
然后在你的主视图中:
@State var sheetAction: SheetAction = SheetAction.nothing
Run Code Online (Sandbox Code Playgroud)
就像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)
})
Run Code Online (Sandbox Code Playgroud)
当用户单击Cancel按钮时,更改其值。nothing并且不要错过每次出现时更改该值SheetView。
最终代码:
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
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5814 次 |
| 最近记录: |