SwiftUI .actionSheet()并非始终存在

31moq8wy  于 2023-01-08  发布在  Swift
关注(0)|答案(2)|浏览(109)

我遇到了一个问题,这个问题源于一个操作表中的按钮打开了附加到ZStack不同子视图的另一个操作表。我不知道为什么,但有时第二个操作表会出现,有时不会。我认为将状态更改代码 Package 在DispatchQueue.main.async { }中会在主线程上运行代码,从而解决这个问题,但有时,当按下“显示AS 2”按钮时,第二个操作表不会出现。2非常感谢对这个问题的任何帮助。
我有个东西看起来像这样:
我有一个包含2个状态变量的普通视图:
@State 变量显示操作表1 =假 @State 变量显示操作表2 =假
视图的主体如下所示:

ZStack {
  HStack {
    Spacer()
    Button(action: {
      showActionSheet1 = true
    }, label: {

    }).actionSheet(isPresented: $showActionSheet1) {
      ActionSheet(
        title: Text("Select an option"),
        buttons: [
          .cancel(),
          .default(Text("Tap to Do Something")) {
            print("Do something")
          },
          .default(Text("Show AS2")) {
            //showing the other action sheet
            DispatchQueue.main.async {
              showActionSheet2 = true
            }
          }
        ]
      )
    }
  }
  VStack {
    Spacer()
    HStack {
      Spacer()
      Text("Element")
    }
  }.actionSheet(isPresented: $showActionSheet2) {
      ActionSheet(
        title: Text("Select an option"),
        buttons: [
          .cancel(),
          .default(Text("Tap to Do Something on second sheet")) {
            print("Do something")
          },
          .default(Text("tap to do something on second sheet 2")) {
            //showing the other action sheet
            print("Do something 2")
          }
        ]
      )
    }
}
f4t66c6m

f4t66c6m1#

一个屏幕上只能有一个ActionSheet,当一个ActionSheet关闭时,它需要时间(由于动画)从屏幕上消失。在此时间内,无法显示第二个ActionSheet。
解决方案是延迟一点激活第二张纸。(实际上在真实的的最终用户流程中很少需要,但最好考虑到这些细节)

.default(Text("Show AS2")) {
        //showing the other action sheet
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {  // << here !!
          showActionSheet2 = true
        }
      }
gstyhher

gstyhher2#

@Asperi是对的,每个视图只能有一个.actionSheet。
您可以通过使用三元运算符来实现这一点。

Xcode 14.1示例:
struct ActionSheetExample {

    @State var showActionSheet: Bool
    @State var isSheetTypeOne: Bool

    var body: some View {
        ZStack {
            VStack(spacing: 10) {
                Button("Main Sheet") {
                    isSheetTypeOne = true
                    showActionSheet = true
                }
            }
            .actionSheet(isPresented: $showActionSheet) {
                isSheetTypeOne ? ActionSheet(
                    title: Text("Select environment"),
                    buttons: [
                        .default(Text("Production")) {
                            isSheetTypeOne = false
                            DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
                                showActionSheet = true
                            }
                        },
                        .default(Text("Staging")) {
                            // Perform some action
                        },
                    ]
                ) : ActionSheet(
                    title: Text("Select your login type"),
                    buttons: [
                        .default(Text("Normal Login")) {
                            // Perform some action
                        },
                        .default(Text("Onboarding")) {
                            // Perform some action
                        }
                    ]
                )
            }
        }
    }
}

相关问题