web-dev-qa-db-ja.com

SwiftUI / CoreData / Master / Detail(編集あり)/ Xcode 11-Beta 5

サンプルアプリに取り組んでいます。目標は、マスターの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)
       }
   }
}
5
ShadowDES

DetailViewのエンティティを、MasterViewから渡されたエンティティにバインドする必要があります。 @Binding var entityName: EntityNameのように宣言します

0
trapper

@trapperで説明したように、entityNameMasterViewにバインドする必要があります。

次のように、DetailView@ObservedObjectを追加すると、更新が反映されます。

@ObservedObject var entityName:EntityName
0
simibac