SwiftUI - 动态按钮列表在 ActionSheet 中

4

我需要在 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()])
    }
3个回答

14

以下是可能的解决方案。

更新:Xcode 13.3 / iOS 15.4

现在actionSheet已经被替换为confirmationDialog,它接受视图构建器,因此现在可以在内部完成,例如:

.confirmationDialog("", isPresented: $showSheet) {
    ForEach(currentOptions.indices, id: \.self) { i in
        Button(currentOptions[i]) { self.option = i + 1 }
    }
}

已废弃:

已测试使用 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)
})

1
您可以通过类似以下的方式实现:
@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

你可以尝试像这样做

    struct ContentView: View {
        @State var showActionSheet: Bool = false
        var titles: [String] = ["Option1", "Option2", "Option3"]
        var buttonsArray: NSMutableArray = NSMutableArray()

        init() {
            loadArray()
        }

        var body: some View {
            Button("Show Action Sheet") {
                self.showActionSheet = true
            }.actionSheet(isPresented: $showActionSheet) { () -> ActionSheet in
                ActionSheet(title: Text("Some Action"), 
                message:  Text("optional message"), 
                buttons: self.buttonsArray as! [ActionSheet.Button])
            }
        }

        func loadArray() {
            for i in 0..<self.titles.count {
                let button: ActionSheet.Button = .default(Text(self.titles[i])) {
                    print(self.titles[i])
                }

                self.buttonsArray[i] = button
            } 
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接