0

这里有一个 Swift 新人。试图理解 SwiftUI。我正在尝试创建一个包装文本和文本字段的“字段”组件。这个想法是减少代码并拥有一个可以显示字段标题及其对应值的控件。

我不知道如何在我的控件上分配模型的值。

这是我的模型:

import Foundation

class EmployeeModel {

    var FullName: String = "John Doe"
    var JobStartDate: String = ""
    var BornDate: String = ""
    var DepartmentId: Int = 0
    var DepartmentName: String = ""
    var isBossDepartment: Bool = false
    var JobPositionId: Int = 0
    var JobPositionName: String = ""
    var PersonalDocNumber: String = ""
    var Password: String = ""

    init() {
    }

}

在视图的某些部分...

struct EmployeeView : View {
    @State private var Employee = EmployeeModel()

    var body : some View {
        Field("Full Name", $Employee.FullName)
    }
}

这是我想要实现的自定义组件。

struct Field : View {
    private var caption: String = ""
    @State private var controlValue: String = ""

    init(caption: String, value: String) {
        self.caption = caption
        controlValue = value
    }

    var body : some View {
        VStack {
            Text(self.caption)
            TextField($controlValue)
                .textFieldStyle(.roundedBorder)
        }
    }
}

目前我收到一条消息

在 EmployeeView 的字段实现中,“绑定”不能转换为“字符串”

4

1 回答 1

1

在深入了解问题的细节之前,请注意按照惯例,类型(类、结构、枚举等)应以大写字母开头,而对象和值应以小写字母(或下划线)开头。如果不遵循该约定,您会使其他人难以阅读代码,正如每个人所期望的那样。

现在,在您的代码上,有几项改进:

  1. controlValue必须声明为@Binding.
  2. @Binding属性不应具有初始值,因为它们应该由调用者传递。
  3. 如果您将属性声明为非私有的,则不需要初始化程序。这没有错,但是如果您确实使用了初始化程序,则需要执行多项更改(请参见下面的代码)。
  4. 您的 TextField 在 beta 5 中使用了已弃用且已停用的初始化程序。
struct EmployeeModel {

    var fullName: String = "John Doe"
    var jobStartDate: String = ""
    var bornDate: String = ""
    var departmentId: Int = 0
    var departmentName: String = ""
    var isBossDepartment: Bool = false
    var jobPositionId: Int = 0
    var jobPositionName: String = ""
    var personalDocNumber: String = ""
    var password: String = ""

    init() {
    }

}

struct EmployeeView : View {
    @State private var employee = EmployeeModel()

    var body : some View {
        Field(caption: "Full Name", value: $employee.fullName)
    }
}

struct Field : View {
    private var caption: String = ""
    @Binding private var controlValue: String

    init(caption: String, value: Binding<String>) {
        self.caption = caption
        self._controlValue = value
    }

    var body : some View {
        VStack {
            Text(self.caption)
            TextField("", text: $controlValue)
                .textFieldStyle(.roundedBorder)
        }
    }
}
于 2019-08-03T03:53:28.007 回答