我正在尝试向SwiftUI选择器添加回调,但是无法执行它。 didSet显然不执行。这是我尝试过的人:
struct ContentView : View {
@State private var picked: Int = 0 {didSet{print("here")}}
var someData = ["a", "b", "c"]
var body: some View {
VStack {
Picker(selection: $picked,
label: Text("")) {
ForEach(0 ..< someData.count) {Text(self.someData[$0]).tag($0)}
}
.pickerStyle(.wheel)
Text("you picked: \(someData[picked])")
}
}
}
答案 0 :(得分:2)
您可以使用ObservableObject解决它
import SwiftUI
class PickerModel:ObservableObject{
@Published var picked: Int = 0 {didSet{print("here")}}
}
struct Picker_Callback: View {
@ObservedObject var pickerModal = PickerModel()
var someData = ["a", "b", "c"]
var body: some View {
VStack {
Picker(selection: self.$pickerModal.picked,
label: Text("")) {
ForEach(0 ..< someData.count) {Text(self.someData[$0]).tag($0)}
}
//.pickerStyle(.wheel)
Text("you picked: \(someData[self.pickerModal.picked])")
}
}
}
答案 1 :(得分:0)
您不能在具有gWQS
属性包装的变量上使用didSet
修饰符。
@State
包装器告诉SwiftUI,包装的值必须由SwiftUI框架本身管理。这意味着该视图实际上并不包含该值,它仅包含一个State
(它是不可变的),它提供对包装值的某种引用。
实际上,您应该忘记SwiftUI State
中的didSet
回调。
View
协议要求使用View
,该协议未标记为body
(SwiftUI视图为mutating
)。因此struct
基本上是不可变的。
答案 2 :(得分:0)
@State变量将永远不会执行didSet,因为它不会更改。改变的是包装值。因此,我认为可以利用它的唯一方法是在中间放置第二个绑定,以充当中介,并传递价值。这样,您可以在其中放置回调。
std::pmr::monotonic_buffer_resource buffer(sizeof(T) * 256);
// Buffer that can hold 256 objects of type `T`.
std::pmr::vector<T> vec(&buffer);
// The vector will use `buffer` as the backing storage.