9.4 弹出一个 Action Sheet 对话框

跟 Alert 对话框不一样,Action Sheet 是从屏幕底部弹出来的,可以翻译成动作菜单/动作面板/行动列表。除了标题和内容,也允许有多种选项。

SwiftUI 为我们提供了一个 ActionSheet 视图来创建 Action Sheet 对话框。但是有一点要注意的是,如果你选择取消了对话框,必须把相关的状态重新设置成 false,否则无法再次弹出。

首先,我们需要定义一个属性来确定是否显示 Action Sheet:

@State var showingSheet = false

接着,需要创建属性来储存 Action Sheet 对话框,包括标题,正文,一组对话按钮。重要一点还是当 Action Sheet 取消的时候,需要重置 showingSheet 这个属性,视图代码如下:

var sheet: ActionSheet {
    ActionSheet(title: Text("Action"), message: Text("Quote mark"), buttons: [.default(Text("Show Sheet"), onTrigger: {
        self.showingSheet = false
    })])
}

最后,需要根据 showingSheet 属性来确定是否显示 Action Sheet 对话框,一个三元表达式,如下:

.presentation(showingSheet ? sheet : nil)

将上面代码全面整合如下:

struct ContentView : View {
    @State var showingSheet = false

    var sheet: ActionSheet {
        ActionSheet(title: Text("Action"), message: Text("Quote mark"), buttons: [.default(Text("Woo"), onTrigger: {
            self.showingSheet = false
        })])
    }

    var body: some View {
        Button(action: {
            self.showingSheet = true
        }) {
            Text("Woo")
        }
            .presentation(showingSheet ? sheet : nil)
    }
}