首页 > 解决方案 > 未启用带有枚举源的 SwiftUI 选择器

问题描述

我正在尝试了解新的 SwiftUI 选择器样式,尤其是对于来自数组以外的源的数据。我已经建立了一个带有枚举的选择器。我首先制作了一个只有选择器和关联枚举的简单应用程序。这按预期工作。

奇怪的是,当我将该代码复制并粘贴到另一个带有表单中其他控件的应用程序中时,选择器似乎处于非活动状态。我看到它,但无法单击它。

这是第一个应用程序(选择器有效):

struct ContentView: View {

    @State private var selectedVegetable = VegetableList.asparagus

    var body: some View {
        NavigationView {
            Form {
                Section {
                    Picker(selection: $selectedVegetable, label: Text("My Vegetables")) {
                        ForEach(VegetableList.allCases) { v in
                            Text(v.name).tag(v)
                            //use of tag makes no difference
                        }
                    }
                }
            }
            .navigationBarTitle("Picker with Enum")
        }
    }
}

enum VegetableList: CaseIterable, Hashable, Identifiable {
    case asparagus
    case celery
    case shallots
    case cucumbers

    var name: String {
        return "\(self)".map {
            $0.isUppercase ? " \($0)" : "\($0)" }.joined().capitalized
    }
    var id: VegetableList {self}
}

这是带有其他控件的应用程序(选择器不起作用)。

struct Order {
    var includeMustard = false
    var includeMayo = false
    var quantity: Int = 1
    var avocadoStyle = PepperoniStyle.sliced
    var vegetableType = VegetableType.none
    var breadType = BreadType.wheat
}

struct OrderForm: View {

    @State private var order = Order()
    @State private var comment = "No Comment"
    @State private var selectedVegetable = VegetableType.asparagus
    @State private var selectedBread = BreadType.rye

    func submitOrder() {}

    var body: some View {
        Form {
            Text("Vegetable Ideas")
                .font(.title)
                .foregroundColor(.green)
            Section {
                Picker(selection: $selectedVegetable, label: Text("Vegetables")) {
                    ForEach(VegetableType.allCases) { v in
                        Text(v.name).tag(v)
                    }
                }
                Picker(selection: $selectedBread, label: Text("Bread")) {
                    ForEach(BreadType.allCases) { b in
                        Text(b.name).tag(b)
                    }
                }
            }

            Toggle(isOn: $order.includeMustard) {
                Text("Include Mustard")
            }

            Toggle(isOn: $order.includeMayo) {
                Text("Include Mayonaisse")
            }

            Stepper(value: $order.quantity, in: 1...10) {
                Text("Quantity: \(order.quantity)")
            }

            TextField("Say What?", text: $comment)

            Button(action: submitOrder) {
                Text("Order")
            }
        }
        .navigationBarTitle("Picker in Form")
        .padding()

    }
}

enum PepperoniStyle {
    case sliced
    case crushed
}

enum BreadType: CaseIterable, Hashable, Identifiable {
    case wheat, white, rye, sourdough, seedfeast
    var name: String { return "\(self)".capitalized }
    var id: BreadType {self}
}

enum VegetableType: CaseIterable, Hashable, Identifiable {
    case none
    case asparagus
    case celery
    case shallots
    case cucumbers
    var name: String {
        return "\(self)".map {
            $0.isUppercase ? " \($0)" : "\($0)" }.joined().capitalized   
    }
    var id: VegetableType {self}
}

Xcode 11 Beta 7, Catalina Beta 7 Preview 和 Simulator 之间没有行为差异。我一定在这里遗漏了一些简单的东西。任何指导将不胜感激。

标签: xcodeuipickerviewswiftuimacos-catalina

解决方案


我将表单包装在 NavigationView 中,现在选择器按预期运行。我需要研究一下,一旦文档更完整,但这也许可以帮助其他人。


推荐阅读