【问题标题】:SwiftUI - Dynamic list of buttons in ActionSheetSwiftUI - ActionSheet 中的动态按钮列表
【发布时间】:2020-05-26 08:06:08
【问题描述】:

我需要在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


    【解决方案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)
    })
    

    【讨论】:

      【解决方案2】:

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

      @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)
          })
      }
      

      【讨论】:

        【解决方案3】:

        你可以试试这样的

            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
                    } 
                }
            }
        

        【讨论】:

          猜你喜欢
          • 2023-04-04
          • 1970-01-01
          • 2019-10-27
          • 2021-09-25
          • 2020-07-14
          • 2023-04-07
          • 1970-01-01
          相关资源
          最近更新 更多