使用SwiftUI呈现ActionSheet的正确方法

时间:2019-06-06 13:58:05

标签: swift modal-dialog swiftui

我想在某些事件(例如单击按钮)上显示ActionSheet(或其他模式,但为Alert)。

我找到了使用状态变量的方法。以这种方式显示它似乎有些奇怪,因为在手动关闭ActionSheet时必须重置变量。

有更好的方法吗?

为什么有一种单独的方法可以显示Alert,从而将其可见性绑定到状态变量?我的方法有什么区别?

struct Sketch : View {
    @State var showActionSheet = false

    var body: some View {
        ZStack {
            Button(action: { showActionSheet = true }) { Text("Show") }
        }
        .presentation(showActionSheet ?
            ActionSheet(
                title: Text("Action"),
                buttons: [
                    ActionSheet.Button.cancel() { 
                        self. showActionSheet = false 
                    }
                ]) 
        : nil)
    }
}

3 个答案:

答案 0 :(得分:1)

为了加强对状态变量方法的偏好,Apple已将其用于警报和操作表API。为了使发现此问题的其他人受益,这里是基于Xcode 11 beta 7,iOS 13的所有3种类型的更新示例。

@State var showAlert = false
@State var showActionSheet = false
@State var showAddModal = false

var body: some View {
    VStack {
        // ALERT
        Button(action: { self.showAlert = true }) {
            Text("Show Alert")
        }
        .alert(isPresented: $showAlert) {
             // Alert(...)
             // showAlert set to false through the binding
        }

        // ACTION SHEET
        Button(action: { self.showActionSheet = true }) {
            Text("Show Action Sheet")
        }
        .actionSheet(isPresented: $showActionSheet) {
             // ActionSheet(...)
             // showActionSheet set to false through the binding
        }

        // FULL-SCREEN VIEW
        Button(action: { self.showAddModal = true }) {
            Text("Show Modal")
        }
        .sheet(isPresented: $showAddModal, onDismiss: {} ) {
            // INSERT a call to the new view, and in it set showAddModal = false to close
            // e.g. AddItem(isPresented: self.$showAddModal)
        }
}

答案 1 :(得分:0)

对于问题的模态部分,可以使用PresentationButton

struct ContentView : View {
    var body: some View {
        PresentationButton(Text("Click to show"), destination: DetailView())
    }
}

Source

答案 2 :(得分:0)

struct Sketch : View {
    @State var showActionSheet = false

    var body: some View {
    ZStack {
        Button(action: { self.showActionSheet.toggle() }) { Text("Show") }
            .actionSheet(isPresented: $showActionSheet) {
                ActionSheet(title: Text("Test"))
            }
        }
    }
}

这是可行的,@State是属性包装器,您的操作表将密切关注它,只要它变为true,便会显示该操作表<​​/ p>