init(sources:selection:content:label:currentValueLabel:)
Creates a picker that displays a custom label and current value label where applicable.
Declaration
nonisolated init<C>(sources: C, selection: KeyPath<C.Element, Binding<SelectionValue>>, @ViewBuilder content: () -> Content, @ViewBuilder label: () -> Label, @ViewBuilder currentValueLabel: () -> some View) where C : RandomAccessCollectionParameters
- sources:
A collection of values used as the source for displaying the Picker’s selection.
- selection:
The key path of the values that determines the currently-selected options. When a user selects an option from the picker, the values at the key path of all items in the
sourcescollection are updated with the selected option. - content:
A view that contains the set of options.
- label:
A view that describes the purpose of selecting an option.
- currentValueLabel:
A view that represents the current value of the picker.
Discussion
If the wrapped values of the collection passed to sources are not all the same, some styles render the selection in a mixed state. The specific presentation depends on the style. For example, a Picker with a menu style uses dashes instead of checkmarks to indicate the selected values.
In the following example, a picker in a document inspector controls the thickness of borders for the currently selected shapes.
enum Thickness: String, CaseIterable, Identifiable {
case thin
case regular
case thick
var id: String { rawValue }
}
struct Border {
var color: Color
var thickness: Thickness
}
@State private var selectedObjectBorders = [
Border(color: .black, thickness: .thin),
Border(color: .red, thickness: .thick)
]
Picker(
sources: $selectedObjectBorders,
selection: \.thickness
) {
ForEach(Thickness.allCases) { thickness in
Text(thickness.rawValue)
}
} currentValueLabel: {
switch selectedObjectBorders.count {
case 0: Text("None")
case 1: Text(selectedObjectBorders[0].thickness.rawValue)
default: Text("Multiple")
}
} label: {
Text("Border Thickness")
}