SwiftUI:选择器不会更新同一视图中的文本
SwiftUI: Picker doesn't update text in same view
我的情况很简单:
struct User: Hashable, Identifiable {
var id: Int
var name: String
func hash(into hasher: inout Hasher) {
hasher.combine(id)
}
}
let bob = User(id: 1, name: "Bob")
let john = User(id: 2, name: "John")
let users = [bob, john]
struct ParentView: View {
@State private var user: User?
var body: some View {
VStack(spacing: 0) {
// Other elements in view...
Divider()
ChildPickerView(user: $user)
Spacer()
}
}
}
struct ChildPickerView: View {
@Binding var user: User?
var body: some View {
HStack {
Text("Selected : \(author?.name ?? "--")")
Picker(selection: $user, label: Text("Select a user")) {
ForEach(0..<users.count) {
Text(users[[=10=]].name)
}
}
}
.padding()
}
}
当我 select 选择器中的另一个值时,上面 Text() 中的名称不会更新。
然而,当再次点击选择器时,selected 用户附近有一个勾号,这意味着该值实际上已经被 selected。那为什么不更新文字呢?
感谢您的帮助
选择类型和选择器内容 id
或 tag
应该相同。在下面找到固定变体。
测试 Xcode 12.1 / iOS 14.1.
VStack {
Text("Selected : \(user?.name ?? "--")")
Picker(selection: $user, label: Text("Select a user")) {
ForEach(users) {
Text([=10=].name).tag(Optional([=10=]))
}
}
}
我的情况很简单:
struct User: Hashable, Identifiable {
var id: Int
var name: String
func hash(into hasher: inout Hasher) {
hasher.combine(id)
}
}
let bob = User(id: 1, name: "Bob")
let john = User(id: 2, name: "John")
let users = [bob, john]
struct ParentView: View {
@State private var user: User?
var body: some View {
VStack(spacing: 0) {
// Other elements in view...
Divider()
ChildPickerView(user: $user)
Spacer()
}
}
}
struct ChildPickerView: View {
@Binding var user: User?
var body: some View {
HStack {
Text("Selected : \(author?.name ?? "--")")
Picker(selection: $user, label: Text("Select a user")) {
ForEach(0..<users.count) {
Text(users[[=10=]].name)
}
}
}
.padding()
}
}
当我 select 选择器中的另一个值时,上面 Text() 中的名称不会更新。 然而,当再次点击选择器时,selected 用户附近有一个勾号,这意味着该值实际上已经被 selected。那为什么不更新文字呢?
感谢您的帮助
选择类型和选择器内容 id
或 tag
应该相同。在下面找到固定变体。
测试 Xcode 12.1 / iOS 14.1.
VStack {
Text("Selected : \(user?.name ?? "--")")
Picker(selection: $user, label: Text("Select a user")) {
ForEach(users) {
Text([=10=].name).tag(Optional([=10=]))
}
}
}