首页 > 解决方案 > 为什么 Property Observer 不适用于 SwiftUI 中的 Picker

问题描述

当我使用按钮(ontapGesture)更改 selecteddrive 时,它​​会打印“值已更改”,但是当我使用 Picker 更改值时,didset 函数不起作用。

enum WheelDrive: String, CaseIterable, Identifiable {
    case frontdrive
    case reardrive
    case Fourwheeldrive
    case Neutral
    var id: String { self.rawValue }
}

@State var selecteddrive = WheelDrive.Fourwheeldrive {
    willSet(newValue){ print("value changed")}
}
Picker(selection: $selecteddrive, label: Text("WheelDrive")) {
    Text("前驱").tag(WheelDrive.frontdrive)
        .foregroundColor(.white)
    Text("后驱").tag(WheelDrive.reardrive)
        .foregroundColor(.white)
    Text("四驱").tag(WheelDrive.Fourwheeldrive)
        .foregroundColor(.white)
    Text("滑行").tag(WheelDrive.Neutral)
        .foregroundColor(.white)
}

标签: iosswiftswiftuipicker

解决方案


使用自定义绑定

Picker(selection: Binding(get: {selecteddrive}, set: {selecteddrive = $0}), label: Text("WheelDrive")) { //<-- Here
    Text("前驱").tag(WheelDrive.frontdrive)
        .foregroundColor(.white)
    Text("后驱").tag(WheelDrive.reardrive)
        .foregroundColor(.white)
    Text("四驱").tag(WheelDrive.Fourwheeldrive)
        .foregroundColor(.white)
    Text("滑行").tag(WheelDrive.Neutral)
        .foregroundColor(.white)
}

或者您可以.onChange用于捕获价值。

Picker(selection: $selecteddrive, label: Text("WheelDrive")) {
    Text("前驱").tag(WheelDrive.frontdrive)
        .foregroundColor(.white)
    Text("后驱").tag(WheelDrive.reardrive)
        .foregroundColor(.white)
    Text("四驱").tag(WheelDrive.Fourwheeldrive)
        .foregroundColor(.white)
    Text("滑行").tag(WheelDrive.Neutral)
        .foregroundColor(.white)
}
.onChange(of: selecteddrive, perform: { (selecteddrive) in //<- Here
    print(selecteddrive)
})

推荐阅读