SwiftUI-ActionSheet中的按钮动态列表

问题描述 投票:0回答:2

我需要在ActionSheet中生成按钮的动态列表。假设我有一组选项["Option1", "Option2"],如何实现呢?

.actionSheet(isPresented: self.$showSheet, content: {
        ActionSheet(title: Text("Select an option"), buttons: [
            .default(Text("Option1")){self.option = 1},
            .default(Text("Option2")){self.option = 2},
            .default(Text("Option3")){self.option = 3},
            .default(Text("Option4")){self.option = 4},
            .cancel()])
    }
swiftui swiftui-actionsheet
2个回答
0
投票

您可以通过以下类似的方法来实现;

@State var flag: Bool = false

@State var options: [(String, () -> Void)] = [
    ("Option - 1", { print("option1 selected")}),
    ("Option - 2", { print("option2 selected")}),
    ("Option - 3", { print("option3 selected")})
]

var body: some View {
    Button("Show action sheet") {
        self.flag = true
    }
    .actionSheet(isPresented: self.$flag, content: {
        var buttons: [ActionSheet.Button] = options.map {
            ActionSheet.Button.default(Text($0.0), action: $0.1)
        }
        buttons.append(.cancel())

        return ActionSheet(title: Text("Select an option"), buttons: buttons)
    })
}

0
投票

这里是可能的解决方案。经过Xcode 11.4 / iOS 13.4的测试]

具有帮助功能

func generateActionSheet(options: [String]) -> ActionSheet {
    let buttons = options.enumerated().map { i, option in
        Alert.Button.default(Text(option), action: { self.option = i + 1 } )
    }
    return ActionSheet(title: Text("Select an option"), 
               buttons: buttons + [Alert.Button.cancel()])
}

然后您可以使用

.actionSheet(isPresented: self.$showSheet, content: {
   // assuming you have `currentOptions` (or similar) property for dynamic
   // options
   self.generateActionSheet(options: self.currentOptions)
})
© www.soinside.com 2019 - 2024. All rights reserved.