SwiftUI无法提取子视图,核心数据,自定义修饰符

时间:2019-10-30 18:46:10

标签: xcode swiftui

我有一个SwiftUI列表/详细信息应用程序,其中有许多数据字段,除了 当然是数据。我正在尝试提取视图,但似乎无法获取 连接正确。

数据在核心数据中,且注释的实体为患者。我将病历传递给 详细视图。当为每个数据字段重复代码时,一切正常。

虽然我认为问题不在于自定义修饰符,但为清楚起见,我将其包括在内 用于添加清除按钮的自定义修饰符的代码。奇怪的是,我不能 找到一个内置的SwiftUI TextField清除按钮。

以下是单个数据元素的相关代码-可行:

var patient: Patient
@State private var updatedTitle: String = "No Title"

//title
VStack(alignment: .leading) {
    Text("Person Title:")
        .padding(.leading, 5)
        .font(.headline)
    HStack {
        TextField("Enter a Title", text: $updatedTitle)
            .frame(minWidth: 0, maxWidth: .infinity)
            .padding(.trailing, -25)
            .padding(.leading, 5)
            .frame(height: 45)
            .onAppear {
                self.updatedTitle = self.patient.title ?? ""
        }
        Text("")
            .frame(width: 35, height: 35)
            .modifier(ClearButton(text: self.$updatedTitle))
            .padding(.trailing, 15)
            .padding(.leading, -20)
    }
    .background(Color("TextFieldBackground")).cornerRadius(8)
    .overlay(
        RoundedRectangle(cornerRadius: 8)
            .stroke(Color.gray, lineWidth: 1)
    )
    .padding(.leading, 10)
    .padding(.trailing, 10)

}.padding(10)

这是我提取子视图的尝试:

struct MyDataCell {

    @Binding var tfData: String
    var passedInLabel: String
    var patient: Patient

    var body: some View {
        VStack(alignment: .leading) {
            Text(passedInLabel)
                .padding(.leading, 5)
                .font(.headline)
            HStack {
                TextField("Enter a Title", text: $tfData)
                    .frame(minWidth: 0, maxWidth: .infinity)
                    .padding(.trailing, -25)
                    .padding(.leading, 5)
                    .frame(height: 45)
                    .onAppear {
                        self.tfData = self.patient.title ?? ""
                }
                Text("")
                    .frame(width: 35, height: 35)
                    .modifier(ClearButton(text: $tfData))
                    .padding(.trailing, 15)
                    .padding(.leading, -20)
            }
            .background(Color("TextFieldBackground")).cornerRadius(8)
            .overlay(
                RoundedRectangle(cornerRadius: 8)
                    .stroke(Color.gray, lineWidth: 1)
            )
            .padding(.leading, 10)
            .padding(.trailing, 10)
        }.padding(10)
    }
}

这是我用来调用子视图的代码行-编译器立即抱怨 与该行无关的错误。

MyDataCell(tfData: $updatedTitle, passedInLabel: "Patient Title", patient: patient)

如上所述,这是自定义修饰符的代码:

struct ClearButton: ViewModifier {
    @Binding var text: String

    public func body(content: Content) -> some View {
        HStack {
            content
            Button(action: {
                self.text = ""
            }) {
                Image(systemName: "multiply.circle.fill")
                    .foregroundColor(.secondary)
            }
        }
    }
}

Xcode版本11.2 beta 2(11B44)我已经尝试了模拟器和设备。任何 指导将不胜感激。

1 个答案:

答案 0 :(得分:0)

MyDataCell需要确认才能查看-结构MyDataCell:View {

需要传入的属性是实体的实际属性。在这种情况下,请传递Patient.title字符串,而不要传递Entity,Patient。然后在.onAppear中使用该字符串。

最后,记住每个视图最多10个项目-将列表分成几组。