【问题标题】:ForEach TextField in SwiftUISwiftUI 中的 ForEach TextField
【发布时间】:2020-06-20 16:53:25
【问题描述】:

假设我有一个班级Student

class Student: Identifiable, ObservableObject {
    var id = UUID()

    @Published var name = ""
}

在另一个类的数组中使用(称为Class

class Class: Identifiable, ObservableObject {
    var id = UUID()

    @Published var name = ""
    var students = [Student()]
}

在我的View 中是这样定义的。

@ObservedObject var newClass = Class()

我的问题是:如何为每个 Student 创建一个 TextField 并将其与 name 属性正确绑定(不会出错)?

ForEach(self.newClass.students) { student in
    TextField("Name", text: student.name)
}

现在,Xcode 正在向我抛出这个:

Cannot convert value of type 'TextField<Text>' to closure result type '_'

我尝试在调用变量之前添加一些$s,但它似乎不起作用。

【问题讨论】:

    标签: ios swift foreach textfield


    【解决方案1】:

    只需将学生姓名属性的@Published 更改为@State@State 是为您提供带有 $ 前缀的 Binding 的那个。

    import SwiftUI
    
    class Student: Identifiable, ObservableObject {
      var id = UUID()
    
      @State var name = ""
    }
    
    class Class: Identifiable, ObservableObject {
      var id = UUID()
    
      @Published var name = ""
      var students = [Student()]
    }
    
    struct ContentView: View {
      @ObservedObject var newClass = Class()
    
      var body: some View {
        Form {
          ForEach(self.newClass.students) { student in
            TextField("Name", text: student.$name) // note the $name here
          }
        }
      }
    }
    
    struct ContentView_Previews: PreviewProvider {
      static var previews: some View {
        ContentView()
      }
    }
    

    一般来说,我还建议使用结构而不是类。

    struct Student: Identifiable {
      var id = UUID()
      @State var name = ""
    }
    
    struct Class: Identifiable {
      var id = UUID()
    
      var name = ""
      var students = [
        Student(name: "Yo"),
        Student(name: "Ya"),
      ]
    }
    
    struct ContentView: View {
      @State private var newClass = Class()
    
      var body: some View {
        Form {
          ForEach(self.newClass.students) { student in
            TextField("Name", text: student.$name)
          }
        }
      }
    }
    

    【讨论】:

    • Xcode 13 给了我这个警告:“在安装在视图之外访问状态的值。这将导致初始值的常量绑定并且不会更新。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-18
    相关资源
    最近更新 更多