使用 Swift 以编程方式控制浮动列表(如下拉列表)

Programmatically controled Floating List (like drop-down list) with Swift

提问人:Yiming Designer 提问时间:11/14/2023 更新时间:11/14/2023 访问量:32

问:

我正在使用 macOS 的 SwiftUI 开发一个应用程序,在此期间我需要一个浮动列表(例如下拉列表的列表框,以及在 SwiftUI 中,如下面的屏幕截图所示)。此外,它应该以编程方式显示和隐藏。PickerMenu

总之,我需要一个列表视图,它:

  1. 具有列表框行为:Picker

    • 当我单击其他地方时自动隐藏列表。
    • 不需要硬编码的高度。它可以适应列表内容的高度。当内容的高度高于全屏时,它会变成滚动列表。
  2. 通过代码隐藏和显示。

  3. 使用代码控制选择指示器(蓝色行背景)。例如,“向上箭头”和“向下箭头”进行选择,“回车”进行选择。

enter image description here

首次尝试:SwiftUI 原生控件

根据这篇文章如何在 SwiftUI 中以编程方式显示菜单。没有合适的视图,我也找不到。

显示列表并需要单击按钮,该按钮无法以编程方式控制。建议的,就像警报视图一样,完全不适合我的情况。PickerMenu.confirmationDialog

第二次尝试:.overlay{}

Text("Click Me")
    .onTapGesture { isPresented.toggle() }
    .overlay {
        if isPresented {
            ScrollView {
                VStack {
                    ForEach(1..<30) {
                        Text("#\($0)")
                    }
                }
            }
            //.frame(height: 300)    // must set height
        }
    }

但是,除非我为它硬编码高度,否则列表不会超出父视图的大小。

第三次尝试:.popover

@State var selection: Int = 0

Text("Selection: \(selection)")
    .onTapGesture {
        isPresented.toggle()
    }
    .popover(isPresented: $isPresented, arrowEdge: .bottom) {
        ScrollView {
            VStack(spacing: 0) {
                ForEach(0..<30, id: \.self) { num in
                    Button {
                        selection = num
                        isPresented = false
                    } label: {
                        Text("#\(num)")
                    }
                    .listRowSeparator(.hidden)
                }
            }
            
        }
        .scrollIndicators(.never)
        .buttonStyle(MenuButtonStyle())
        .padding(4)
        
    }

更好,但有一些问题,如果可以解决,那就再好不过了:

  1. 列表将要从计算机屏幕中出来,它变成了一个滚动列表。但是,没有箭头指示器直观地告诉您可以向下滚动。(预期结果如下图所示)

  2. 弹出框视图的动画和指示箭头很烦人,我发现无法在 SwiftUI 中删除它们。

enter image description here

第四次尝试:向其他框架寻求帮助

我正在从其他 UI 框架中搜索一些解决方案,例如 ,但我只有 SwiftUI 的经验,对其他人不太熟悉。我找不到合适的视图。AppKit

真诚期待您的帮助!:)

Swift macOS SwiftUI AppKit

评论


答: 暂无答案