具有 10 多个项目的 SwiftUI 菜单按钮

Posted

技术标签:

【中文标题】具有 10 多个项目的 SwiftUI 菜单按钮【英文标题】:SwiftUI MenuButton with more than 10 Items 【发布时间】:2020-05-06 13:30:35 【问题描述】:

我有一个 SwiftUI 菜单按钮,可以很好地处理 10 个或更少的项目:

struct ContentView: View 
    var body: some View 
        MenuButton("My Button") 
            Button("A")  
            Button("B")  
            Button("C")  
            Button("D")  
            Button("E")  
            Button("F")  
            Button("G")  
            Button("H")  
            Button("I")  
            Button("J")  
        
    

但是,当添加第 11 个项目时,它不会编译,因为 SwiftUI 将组的大小限制为 10。对于普通组(如 VStack),我只会将一些项目包装在 Group 或 @ 987654330@,但这会破坏MenuButton 的视觉效果。

将前 5 个元素包装在 Group 中:

将前 5 个元素包装在 Section 中:

将前 5 个元素包裹在 VStack 中(间距很好,但整个组可以一起选择):

这样做的正确方法是什么?

【问题讨论】:

【参考方案1】:

这是一个解决方案 - 您可以保留一系列项目来配置每个菜单项按钮。使用 Xcode 11.4 测试。

struct TestLongMenuButton: View 
    let actions = ["A","B","C","D","E","F","G","H","I","J","K","L"]

    var body: some View 
        MenuButton("My Button") 
            ForEach(actions, id: \.self)  action in
                Button(action)  
            
        
    

【讨论】:

【参考方案2】:

Asperi 的解决方案是可靠的。这是一个版本,它允许对具有相对编译安全性的每个项目执行不同的操作(只要每个标签可以不同)。

struct ContentView: View 
    enum Item: String, CaseIterable 
        case a = "Label A"
        case b = "Label B"

        func performAction() -> Void 
            switch self 
            case .a:
                print("Doing a")
            case .b:
                print("Doing b")
            
        
    

    var body: some View 
        MenuButton("My Button") 
            ForEach(Item.allCases, id: \.self)  key in
                Button(key.rawValue, action: key.performAction)
            
        
    

【讨论】:

以上是关于具有 10 多个项目的 SwiftUI 菜单按钮的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI ForEach 内容中将多个按钮操作分开?

SwipeActions 按钮和 ToolBar 按钮触发的多个工作表(项目:)在 SwiftUI 中首次获取 nil 对象

iOS:如何使用侧边菜单、SwiftUI 切换视图

SwiftUI - 在按钮单击时添加一行多个文本字段/视图

SwiftUI Navigation 多个后退按钮

swiftui 从菜单按钮打开视图