SwiftUI:选取器不会更新同一视图中的文本

Posted

技术标签:

【中文标题】SwiftUI:选取器不会更新同一视图中的文本【英文标题】:SwiftUI: Picker doesn't update text in same view 【发布时间】:2020-11-16 13:58:21 【问题描述】:

我有这种简单的情况:

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[$0].name)
                
            
        
        .padding()
    

当我在选择器中选择另一个值时,上面的 Text() 中的名称不会更新。 但是,当再次点击选择器时,被选择的用户附近有一个勾号,这意味着该值已经被实际选中。那为什么文字没有更新呢?

感谢您的帮助

【问题讨论】:

【参考方案1】:

选择类型和选择器内容idtag 应该相同。在下面找到固定的变体。

使用 Xcode 12.1 / ios 14.1 测试。

    VStack 
        Text("Selected : \(user?.name ?? "--")")
        Picker(selection: $user, label: Text("Select a user")) 
            ForEach(users) 
                Text($0.name).tag(Optional($0))
            
        
    

【讨论】:

以上是关于SwiftUI:选取器不会更新同一视图中的文本的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 2 .onChange() 中的选取器不会更改 UINavigationBar.appearance()

选择器中的 SwiftUI 和枚举

SwiftUI:列表项跳转到选取器表单中的标题

SwiftUI:将选取器选择设置为动态数组中的最后一个

SwiftUI 无法删除选取器上方的空间 - 表单版本

在 SwiftUI 中将选取器更改为文本字段