向SwiftUI Picker添加回调

时间:2019-07-17 22:05:43

标签: callback picker swiftui

我正在尝试向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])")
        }
    }
}

3 个答案:

答案 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.