问题描述
我可以在 CoreData 中保存对象。我的实体属性是字符串类型,并保存输入到文本字段中的任何内容。我可以使用我指定的任何索引的 FetchedEntityRequest[index] 更新属性,但我无法保存传递到 DeatailView 的选定属性。请参阅下面的示例代码。
//save Attribute
func saveButtonTapped(text: String?) {
if let context = (UIApplication.shared.delegate as? AppDelegate)?.persistentContainer.viewContext {
let Entity.attribute: String = Entity(context: context)
Entity.attribute: = text
if context.hasChanges {
do {
try context.save()
} catch {
print(error.localizedDescription)
}
}
// pass attribute to DetailView from List View
@Environment(\.managedobjectContext) var managedobjectContext
@FetchRequest(
entity: Entity.entity(),sortDescriptors: [
NSSortDescriptor(keyPath: \Entity.attribute,ascending: true)
]
) var fetchedEntityRequest: FetchedResults<Entity>
var body: some View {
NavigationView {
List {
ForEach(fetchedEntityRequest,id: \.self) { entity in
vstack {
HStack {
Text(entity.attribute ?? "")
.font(.headline)
Spacer()
NavigationLink(destination: EditLyricsView(text: entity.attribute ?? "")) {
}
}
.frame(maxWidth: .infinity,maxHeight: .infinity,alignment: .center)
//DetailView - updating the index specified and saving changes to coredata.
@State var text: String = ""
@Environment(\.managedobjectContext) var managedobjectContext
@FetchRequest(
entity: Entity.entity(),sortDescriptors: [
NSSortDescriptor(keyPath: \Entity.attribute,ascending: true)
]
) var fetchedEntityRequest: FetchedResults<Entity>
var body: some View {
NavigationView {
vstack {
TextView(text: $text)
} .navigationBarTitle(Text("self.text"),displayMode: .inline)
.navigationBarItems(leading: Button("Home") {
presentationMode.wrappedValue.dismiss()
},trailing: Button("Save") {
fetchedEntityRequest.forEach { i in
var index: Int = 0
fetchedEntityRequest[index].setValue(text,forKey: "Entity.attribute")
presentationMode.wrappedValue.dismiss()
}
}
}
解决方法
谢谢阿斯佩里! - 那行得通。请参阅下面的更新。
NavigationLink(destination: DetailedView(text: entity.attribute ?? "",entity: Entity)) {
}
我在 Entity 类型的 DetailsView 上创建了一个 @Stated var?并调用下面的。
Entity?.setValue(text,forKey: entity.attribute)