检测 SwiftUI 工作表何时被滑开

Lem*_*mon 5 swift swiftui

所以我有一张表格,左侧有一个取消按钮,右侧有一个完成按钮,如下所示:

.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)

在此输入图像描述