SwiftUI - 没有标题的操作表,Alert.Button 使用视图而不是文本

War*_*ior 8 ios swiftui actionsheet

有没有办法在操作表中没有标题部分?SwiftUI 代码中的 Action Sheet 定义如下:

public struct ActionSheet {
   /// Creates an action sheet with the provided buttons.
   public init(title: Text, message: Text? = nil, buttons: [ActionSheet.Button] = [.cancel()])
   /// A button representing an operation of an action sheet presentation.
   public typealias Button = Alert.Button
}
Run Code Online (Sandbox Code Playgroud)

由于标题只符合文本,我想也许只添加 Text("") 就可以了;然而,这反而将标题的空间保留为空,而不是将其删除。给 nil 而不是 Text("") 也不起作用。

另外,有没有办法给动作表的按钮一个视图,如下所示:

struct ActionItem: View {

  var body: some View {

    HStack {

        Image(systemName: "phone")

        Spacer()

        Text("Call 1-408-123-4567")
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Joh*_* M. 15

最简洁的答案是不。SwiftUI 的当前实现将始终为标题腾出空间,并且只会Text为其按钮获取视图。

目前还不清楚这是否是因为苹果在今年发布 SwiftUI 之前只有这么多时间,并且想要解决最简单和最常见的用例,或者他们是否采取了原则立场,即 ActionSheets 应该始终具有标准外观,包括标题和只有文本按钮。我们将不得不拭目以待。

  • 不显示标题是有正当理由的。例如,点击省略号按钮时,提醒应用程序中显示的列表操作表具有各种操作,但没有标题。恕我直言,在这里显示“选择操作”之类的标题是多余的。 (3认同)
  • 苹果公司在其通讯录应用程序中就是这么做的。尝试删除联系人列表中的联系人,然后显示操作表以确认删除,只有两个按钮且没有标题。 (2认同)

Dan*_*sko 12

苹果通过 iOS 15 和新推出的confirmationDialogAPI 回应了我们的呼吁。ActionSheet此版本中也已弃用。

ConfirmationDialog已作为视图修饰符添加,可以在任何视图上使用,与.actionSheet我们之前使用的 API 非常相似。使用新对话框时,我们可以指定隐藏标题,并可以使用按钮 API 来role控制按钮外观。

下面是在简单视图上使用它的示例。

struct ContentView: View {
    
    @State private var isShowingDialog: Bool = false
    
    var body: some View {
        VStack {
            Button {
                isShowingDialog = true
            } label: {
                Text("Tap Me")
            }
             .confirmationDialog("", isPresented: $isShowingDialog, titleVisibility: .hidden) {
                 Button("Normal") {
                 }
                 Button("Delete", role: .destructive) {
                 }
                 Button("Cancel", role: .cancel) {
                 }
            }
        }
    }
}

Run Code Online (Sandbox Code Playgroud)

在此输入图像描述