【问题标题】:Detect when a SwiftUI sheet is swiped away检测 SwiftUI 工作表何时被刷掉
【发布时间】:2020-12-26 07:46:39
【问题描述】:

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

.navigationBarItems(leading: Button(action: {
    // Code that dismisses sheet
}) {
    Text("Cancel")
}, trailing: Button(action: {
    // Code that adds something to something
}) {
    Text("Add").bold()
})

我想要做的是在我的 SwiftUI 'sheet' 被滑开(向下)时执行一段代码。这不适用于onDismissonDisappear,因为它们都会在按下任何按钮以及当它被滑开时执行。

可以这样做吗?

【问题讨论】:

  • onDismiss 是一个正确的地方 - 只需使用应用程序逻辑来处理正确的流程。例如带有确定/取消情况的枚举,或在每个按钮操作中分配的带有块的变量等。
  • @Asperi 最好的方法是什么?
  • 没有最好的方法,在某些时候有可能适合应用程序逻辑的方法。使用哪一个取决于您……无论如何,在下一个应用版本中它可能会改变。
  • @Asperi 我最终使用它来解决我的问题 :) 如果您创建一个解释它的基本答案,我会将其标记为已接受 - 谢谢!

标签: swift swiftui


【解决方案1】:

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
        }
    }
}

【讨论】:

  • 哇!这是一个非常好的答案!非常感谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-23
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多