SwiftUI:如何在单击ActionSheet按钮时呈现新视图?

时间:2019-09-20 04:57:16

标签: ios swiftui ios13

我有一个动作表,其中包含三个动作

  1. Action_1
  2. Action_2
  3. 取消

如果我点击“ Action_1”,则我的应用应显示ActionView_1()。 如果我点击“ Action_2”,则我的应用应显示ActionView_2()。

我之所以提出这个观点是

.sheet(isPresented: $isAddSecretVisible){ActionView_1()}

但这用于通过单击按钮呈现视图。

如果点击“动作表”按钮,我需要执行相同的动作。 在 SwiftUI

中回答需求

谢谢。

2 个答案:

答案 0 :(得分:0)

参考链接:SwiftUI

ActionSheet(title: Text("iOSDevCenters"), message: Text("SubTitle"), buttons: [
            .default(Text("Action_1"), action: {
                                print("Action_1")
                                ActionView_1()
                            }),
            .destructive(Text("Cancel"))
         ])
})

答案 1 :(得分:0)

您应该定义2个State,每个工作表分别定义一个:

@State var isMainActionPresented = false
@State var isActionViewPresented = false

还有一个State用于确定要呈现的女巫actionSheet。因此,您可以为此提供一个枚举:

enum ActionViewMode {
    case first
    case second
}

还有一个辅助扩展程序:

extension ActionViewMode {
    var view: some View {
        switch self {
            case .first: return ActionView1()
            case .second: return ActionView2()
        }
    }
}

然后单击任何ButtonActionSheet.Button,切换所需的状态。查看下面的完整ContentView代码:

@State var actionViewMode = ActionViewMode.first

@State var isMainActionPresented = false
@State var isActionViewPresented = false

var body: some View {
    Button(action: {
        self.isMainActionPresented = true
    }) {
        Text("ActionSheet")
    }
    .actionSheet(isPresented: $isMainActionPresented) {
        ActionSheet(
            title: Text("Title"),
            message: Text("Message"),
            buttons: [
                .default(
                    Text("Action_1"),
                    action: {
                        self.actionViewMode = .first
                        self.isActionViewPresented = true
                }),
                .default(
                    Text("Action_2"),
                    action: {
                        self.actionViewMode = .second
                        self.isActionViewPresented = true
                }),
                .cancel()
        ])
    }
    .sheet(isPresented: $isActionViewPresented) {
        self.actionViewMode.view
    }
}

SwiftUI将处理其余的内容。

请注意,您不能一个接一个地链接多个工作表,因为每个工作表都会以某种方式覆盖前一个工作表。