代码之家  ›  专栏  ›  技术社区  ›  ShadowDES

swiftui/coredata/master/detail(带编辑)/xcode 11-beta 5

  •  0
  • ShadowDES  · 技术社区  · 5 年前

    正在处理示例应用程序。我们的目标是从master中的coredata中提取一个列表,然后单击其中一个列表转到一个细节,在那里您可以编辑信息并保存。当您编辑细节中的“名称”时,它不仅会更新细节以反映更改,而且还会反映主控形状上的更改。我已经尝试了很多方法来实现这一点,但是到目前为止还没有找到答案。

    // 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)
           }
       }
    }
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   Chuck H    5 年前

    正如所承诺的,这里有一个链接到一个使用coredata的示例swiftui程序的初始剪切。它在beta 6上编译和运行。它不使用新的@fetchrequest属性包装器,因为它在beta 6中仍然有缺陷。我写了一个coredatasource类,它做的基本上是相同的事情,还有更多。

    https://github.com/Whiffer/SwiftUI-Core-Data-Test

        2
  •  0
  •   trapper    5 年前

    您需要将detailview中的实体绑定到从masterview传入的实体。像这样宣布 @Binding var entityName: EntityName