【问题标题】:SwiftUI Can't Extract Subview, Core Data, Custom ModifierSwiftUI 无法提取子视图、核心数据、自定义修饰符
【发布时间】:2020-02-26 03:20:10
【问题描述】:

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

数据在 Core Data 中,注意的实体是 Patient。我将病历传递给 详细视图。当代码为每个数据字段重复时,一切正常。

虽然我认为问题不在于自定义修饰符,但为了清楚起见,我已包含 添加清除按钮的自定义修饰符的代码。奇怪的是,我不能 找到一个内置的 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) 我已经尝试过模拟器和设备。任何 将不胜感激。

【问题讨论】:

  • 我相信这确实有效 - 但我有两个错误。首先,我没有让 MyDataCell 符合 View(监督),其次我违反了每个视图 10 个项目的讨厌规则(在中间组中插入了一个 Spacer()。我会为其他人测试和报告。
  • 我说得太早了。我还用“self.tfData = self.patient.title ??”“”对字段的总体进行了硬编码。需要引入另一个变量来传递。

标签: xcode swiftui


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    相关资源
    最近更新 更多