【发布时间】: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 ??”“”对字段的总体进行了硬编码。需要引入另一个变量来传递。