SwiftUI / CoreData / Master / Detail(带编辑)/ Xcode 11 - Beta 5
SwiftUI / CoreData / Master / Detail (with editing) / Xcode 11 - Beta 5
正在开发示例应用程序。目标是从 Master 中的 CoreData 中提取一个列表,然后单击一个以转到详细信息,您可以在其中编辑信息并保存。当您在详细信息中编辑 "name" 时,它不仅会更新详细信息以反映更改,还会反映主文件的更改。我已经尝试了很多方法来实现这个,但到目前为止还没有找到答案。
// Code generation is turned OFF in the xcdatamodeld file
public class EntityName: NSManagedObject, Identifiable {
@NSManaged public var name: String
@NSManaged public var active: Bool
}
extension EntityName {
static func allEntityNameFetchRequest() -> NSFetchRequest<EntityName> {
let request: NSFetchRequest<EntityName> = EntityName.fetchRequest() as! NSFetchRequest<EntityName>
request.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]
return request
}
}
struct MasterView: View {
@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(fetchRequest: EntityName.allEntityNameFetchRequest()) var allEntityNames: FetchedResults<EntityName>
var body: some View {
NavigationView {
List {
ForEach(self.allEntityNames) { entityName in
NavigationLink(destination: DetailView(entityName: entityName)) {
VStack(alignment: .leading) {
Text(entityName.name)
.font(.headline)
Text(String(entityName.active))
.font(.subheadline)
}
}
}
}
}
.onAppear() {
// Just want to populate the Core Data to have a few to work with
if self.allEntityNames.count == 0 {
for _ in 1...3 {
let newEntry = EntityName(context: self.managedObjectContext)
newEntry.name = "New Entry"
try! self.managedObjectContext.save()
}
}
}
}
}
struct DetailView: View {
var entityName = EntityName()
var body: some View {
VStack {
Text("Name: \(entityName.name)")
Text("Active: \(String(entityName.active))")
// What I'd like to do now:
//TextField("", text: $entityName.name)
//Toggle(isOn: $entityName.active)
}
}
}
您需要将DetailView中的实体绑定到MasterView传入的实体上。声明为 @Binding var entityName: EntityName
正如所承诺的那样,这里是一个 link 示例使用 CoreData 的 SwiftUI 程序。当前版本在 GM 版本上编译和运行。它不使用新的 @FetchRequest 属性 包装器,因为它不能满足我的所有需求。我写了一个 CoreDataDataSource class,它做的事情基本上是一样的,而且还有更多。
正如@trapper 所解释的那样,entityName
必须绑定到 MasterView
。
当您在 DetailView
中添加 @ObservedObject
时,更新会反映如下:
@ObservedObject var entityName:EntityName
正在开发示例应用程序。目标是从 Master 中的 CoreData 中提取一个列表,然后单击一个以转到详细信息,您可以在其中编辑信息并保存。当您在详细信息中编辑 "name" 时,它不仅会更新详细信息以反映更改,还会反映主文件的更改。我已经尝试了很多方法来实现这个,但到目前为止还没有找到答案。
// Code generation is turned OFF in the xcdatamodeld file
public class EntityName: NSManagedObject, Identifiable {
@NSManaged public var name: String
@NSManaged public var active: Bool
}
extension EntityName {
static func allEntityNameFetchRequest() -> NSFetchRequest<EntityName> {
let request: NSFetchRequest<EntityName> = EntityName.fetchRequest() as! NSFetchRequest<EntityName>
request.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]
return request
}
}
struct MasterView: View {
@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(fetchRequest: EntityName.allEntityNameFetchRequest()) var allEntityNames: FetchedResults<EntityName>
var body: some View {
NavigationView {
List {
ForEach(self.allEntityNames) { entityName in
NavigationLink(destination: DetailView(entityName: entityName)) {
VStack(alignment: .leading) {
Text(entityName.name)
.font(.headline)
Text(String(entityName.active))
.font(.subheadline)
}
}
}
}
}
.onAppear() {
// Just want to populate the Core Data to have a few to work with
if self.allEntityNames.count == 0 {
for _ in 1...3 {
let newEntry = EntityName(context: self.managedObjectContext)
newEntry.name = "New Entry"
try! self.managedObjectContext.save()
}
}
}
}
}
struct DetailView: View {
var entityName = EntityName()
var body: some View {
VStack {
Text("Name: \(entityName.name)")
Text("Active: \(String(entityName.active))")
// What I'd like to do now:
//TextField("", text: $entityName.name)
//Toggle(isOn: $entityName.active)
}
}
}
您需要将DetailView中的实体绑定到MasterView传入的实体上。声明为 @Binding var entityName: EntityName
正如所承诺的那样,这里是一个 link 示例使用 CoreData 的 SwiftUI 程序。当前版本在 GM 版本上编译和运行。它不使用新的 @FetchRequest 属性 包装器,因为它不能满足我的所有需求。我写了一个 CoreDataDataSource class,它做的事情基本上是一样的,而且还有更多。
正如@trapper 所解释的那样,entityName
必须绑定到 MasterView
。
当您在 DetailView
中添加 @ObservedObject
时,更新会反映如下:
@ObservedObject var entityName:EntityName