我正在使用 SwiftUI 并希望根据选择器中的项目数量设置视图的选择器样式。对于一些项目,SegmentedPickerStyle() 是理想的,WheelPickerStyle() 越多越好。
}.pickerStyle(productsObserver.product.productFamilies?.count ?? 0 < 5 ? SegmentedPickerStyle() : WheelPickerStyle())
函数签名读作:func pickerStyle<S>(_ style: S) -> some View where S : PickerStyle
我学到的在函数签名中使用泛型,因为 PickerStyle 使用关联类型。
它不应该是一个那么困难的问题,可能也不是 - 协议应该像这样简单的 = 一样工作,但我看不到它。任何帮助表示高度赞赏!
pickerStyle
是一种通用方法,它接受符合 的具体类型(在编译时)PickerStyle
。因此,它不能是SegmentedPickerStyle
或WheelPickerStyle
(在运行时确定) - 它必须是一个或另一个。
因此,一个建议是创建一个视图修改器并有条件地应用选择器样式。这里的关键区别在于它返回 type 的条件视图_ConditionalContent<TrueContent, FalseContent>
。
struct PickerStyleOption<P1: PickerStyle, P2: PickerStyle>: ViewModifier {
let predicate: () -> Bool
let style1: P1
let style2: P2
@ViewBuilder
func body(content: Content) -> some View {
if predicate() {
content
.pickerStyle(style1)
} else {
content
.pickerStyle(style2)
}
}
}
为方便起见,您可以创建一个扩展:
extension View {
func pickerStyleOption<P1: PickerStyle, P2: PickerStyle>(
_ condition: @autoclosure @escaping () -> Bool,
then style1: P1,
else style2: P2) -> some View {
self.modifier(
PickerStyleOption(predicate: condition, style1: style1, style2: style2)
)
}
}
并像这样使用它:
Picker(...) {
...
}
.pickerStyleOption((productsObserver.product.productFamilies?.count ?? 0) < 5,
then: SegmentedPickerStyle(), else: WheelPickerStyle())
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句