SwiftUI - ActionSheet 中的动态按钮列表
SwiftUI - Dynamic list of buttons in ActionSheet
我需要在 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()])
}
您可以通过类似下面的方式实现;
@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([=10=].0), action: [=10=].1)
}
buttons.append(.cancel())
return ActionSheet(title: Text("Select an option"), buttons: buttons)
})
}
这是可能的解决方案。
更新: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)
})
你可以试试这样的
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
}
}
}
我需要在 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()])
}
您可以通过类似下面的方式实现;
@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([=10=].0), action: [=10=].1)
}
buttons.append(.cancel())
return ActionSheet(title: Text("Select an option"), buttons: buttons)
})
}
这是可能的解决方案。
更新: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)
})
你可以试试这样的
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
}
}
}