代码之家  ›  专栏  ›  技术社区  ›  TruMan1

如何在菜单式文件应用程序中建立排序方向?

  •  1
  • TruMan1  · 技术社区  · 2 年前

    我正在我的 Menu ,但我也希望用户能够以文件应用程序的工作方式控制排序方向:再次点击可切换排序方向。

    enter image description here

    以下是我所拥有的:

    @State private var selectedSort: SortOption = .name
    @State private var isSortAscending = true
    
    enum SortOption {
        case name
        case number
        case length
    }
    
    Menu {
        Picker(selection: $selectedSort, label: Text("Sorting options")) {
            Button {
                isSortAscending.toggle()
            } label: {
                HStack {
                    Text("Name")
                    Spacer()
                    Image(systemName: isSortAscending ? "chevron.down" : "chevron.up")
                }
            }
            .tag(SortOption.name)
            Button {
                isSortAscending.toggle()
            } label: {
                HStack {
                    Text("Number")
                    Spacer()
                    Image(systemName: isSortAscending ? "chevron.down" : "chevron.up")
                }
            }
            .tag(SortOption.number)
            Button {
                isSortAscending.toggle()
            } label: {
                HStack {
                    Text("Length")
                    Spacer()
                    Image(systemName: isSortAscending ? "chevron.down" : "chevron.up")
                }
            }
            .tag(SortOption.length)
        }
    }
    

    点击根本不会切换排序状态。是否有更好或更受支持的方法来做到这一点?

    1 回复  |  直到 2 年前
        1
  •  1
  •   Asperi    2 年前

    选择的项目是内部处理的,所以我们需要选择的副作用。可以通过注入 will-set 可计算绑定中的副作用。

    以下是使用Xcode 13.4/iOS 15.5测试的可能方法

    demo

    主要部分:

    var sorting: Binding<SortOption> { .init(
        get: { self.selectedSort },
        set: {
            if self.selectedSort == $0 {
                self.isSortAscending.toggle()
            }
            self.selectedSort = $0
        }
    )}
    
    var body: some View {
        Menu("Sort") {
            Picker(selection: sorting, label: Text("Sorting options")) {
                ForEach(SortOption.allCases) { option in
                    HStack {
                        Text(option.rawValue)
                        Spacer()
                        if selectedSort == option {
                            Image(systemName: isSortAscending ? "chevron.down" : "chevron.up")
                        }
    

    Test module on GitHub