ios 带菜单的拾取器不适用于Int32,但适用于Int

zrfyljdw  于 12个月前  发布在  iOS
关注(0)|答案(2)|浏览(126)

这段代码不起作用,这意味着onChange永远不会被调用,并且当选择了一个选项时,变量不会被更改。

struct ExamplePicker: View {
    
    @State var val: Int32 = 2
    
    var body: some View {
        HStack {
            
            Menu {
                
                Picker(selection: $val, label: EmptyView()) {
                    
                    Text("Val1").tag(1)
                    Text("Val2").tag(2)
                    Text("Val3").tag(3)
                }                   
            } label: {
                HStack {
                    Text("Value: ")
                    Spacer()
                    
                    Text(String(format: "%d", val))
                    
                    Spacer()
                }
            }
            .onChange(of: val) { newSelection in
               print(">>> HERE")
           }    
        }
    }
}

但是如果你把瓦尔改为Int类型,它会工作得很好。我看这像个窃听器
编辑:解决了-问题是在.tag()中你需要完全相同的类型。所以.tag(1)应该是Int而不是Int 32。因此需要.tag(Int 32(1))
只是为了让它更混乱,这是有效的:

struct ExamplePicker: View {
    
    @Binding var val: Int64
    
    var body: some View {
        HStack {
            
            Picker(selection: $val, label: EmptyView()) {
                
                Text("Val1").tag(1)
                Text("Val2").tag(2)
                Text("Val3").tag(3)
            }
            .onChange(of: val) { newSelection in
                print(">>> HERE")
            }   
        }
    }
}
pgccezyw

pgccezyw1#

Picker项的tag值与状态变量的类型相同时,它可以正常工作。就像这样:

Picker(selection: $val, label: EmptyView()) {
    Text("Val1").tag(Int32(1))
    Text("Val2").tag(Int32(2))
    Text("Val3").tag(Int32(3))
}
n3h0vuf2

n3h0vuf22#

当执行.tag(1)时,1的类型是Inttag不知道你传递给selection:Binding是什么类型的-任何Hashable的东西都可以在那里:

func tag<V>(_ tag: V) -> some View where V : Hashable

通过类型推断,tag(1)中的1被推断为Int,因为我重复一遍,tagselection:一无所知。
因此selection:绑定的类型与标记的类型不同。这意味着当你在选择器中选择某个东西时,SwiftUI不知道它应该将选择值更改为什么。出于同样的原因,它也不知道当前选择了哪个选项。
要使Int32选择工作,明确地说123等是Int32 s:

Text("Val1").tag(Int32(1))
Text("Val2").tag(Int32(2))
Text("Val3").tag(Int32(3))

相关问题