Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Callback 向SwiftUI选择器添加回调_Callback_Picker_Swiftui - Fatal编程技术网

Callback 向SwiftUI选择器添加回调

Callback 向SwiftUI选择器添加回调,callback,picker,swiftui,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 { Pic

我正在尝试向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])")
        }
    }
}
struct ContentView:View{
@选择的状态私有变量:Int=0{didSet{print(“此处”)}
var someData=[“a”、“b”、“c”]
var body:一些观点{
VStack{
选择器(选择:$picked,
标签:文本(“”){
ForEach(0..
您不能对带有
@State
属性包装的变量使用
didSet
修饰符

状态
包装器告诉SwiftUI,包装的值必须由SwiftUI框架本身管理。这意味着视图实际上并不包含该值,它只包含一个
状态
(该状态是不可变的),它提供了对包装值的某种引用

实际上,您应该忘记SwiftUI
视图中的
didSet
回调。
视图
协议需要一个
主体
,该主体未被标记为
变异
(SwiftUI视图是
结构
)。因此,
视图基本上是不变的。

代码更新为beta 6

@State变量永远不会执行didSet,因为它不会更改。改变的是包装的值。所以,我唯一能想到的方法就是把第二个绑定放在中间,作为中介,并传递价值。这样,你可以把你的回拨放在那里

struct ContentView:View{
@已拾取状态私有变量:Int=0
var someData=[“a”、“b”、“c”]
var body:一些观点{
设p=Binding(get:{
自选返回
},集:{
self.picked=$0
//你的回电在这里
打印(“设置值\($0)”)
})
返回VStack{
选择器(选择:p,
标签:文本(“”){
ForEach(0..
您可以使用ObserveObject来解决此问题


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])")
        }
    }
}


导入快捷键
类PickerModel:ObservableObject{
@已发布变量:Int=0{didSet{print(“此处”)}
}
结构选择器回调:视图{
@ObservedObject变量pickerModal=PickerModel()
var someData=[“a”、“b”、“c”]
var body:一些观点{
VStack{
选择器(选择:self.$pickerModal.picked,
标签:文本(“”){
ForEach(0..
rraphael是100%正确的。迪德集永远不会被调用。检查我的答案以找到解决方法。
.onChange
修饰符(用于选择器等)可用,这在某些情况下可能已经足够了。Doesn未编译:函数声明不透明的返回类型,但在其主体中没有用于推断基础类型的返回语句。这只起了一半作用。我似乎可以让它工作回来。假设您希望转换通过绑定传入的字母“b”,并使其成为所选按钮。我来不了work@jimijon这是一个与SwiftUI无关的小问题:只需在数组中查找项索引:
self.pick=self.someData.firstIndex(of:“b”)??0
它不是。设置绑定后,尝试将其传递给视图。如何设置绑定:@binding alphabetLetter:String?然后需要将self.picked设置为self.someData。首先。。。这就导致了无限的loopUau很好的解决方案,效果很好!我需要这个来更新来自父视图的绑定变量。