请允许我解释一下我的情况,因为我只是从核心数据开始。我将尝试总结,因为有太多的代码。
我想使用核心数据创建一个简单的程序,它具有:
- 合同实体(具有编号、签订日期、合同标的、费用等属性)
- 客户端实体(客户端名称、地址、idNumber)
- 发票实体
合同实体和客户实体应该是一对一关系,一个合同对应一个客户。
我的意图是,无论何时创建合同,我都会同时创建一个客户端(在同一个视图中的同一个表单中)。基本上,我希望将“合同”实体传递给一个新视图,但从“合同”实体中提取“客户端”属性(名称、地址)。
但是,在NSManagedObject子类中,Client是可选的类示例。
我为每个实体创建了一个NSManagedObject子类。在我的Contract+CoreDataProperties swift文件中,我有一个@NSManaged公共变量,它是一个可选的客户端。
extension Contract {
@nonobjc public class func fetchRequest() -> NSFetchRequest<Contract> {
return NSFetchRequest<Contract>(entityName: "Contract")
}
@NSManaged public var objectOfContract: String?
@NSManaged public var registrationNumber: String?
@NSManaged public var client: Client?
@NSManaged public var invoice: NSSet?
现在,在从存储中获取合同之后,我将合同传递给一个新视图。
我想以某种方式从contract. client中提取客户端属性。
如何操作?如何在NSManagedObject子类中展开“客户端”?
下面是代码的简短版本:
视图1(部分):
@Environment(\.managedObjectContext) var moc
@FetchRequest(sortDescriptors: []) var contracts: FetchedResults<Contract>
ForEach (contracts, id: \.self) {contract in
NavigationLink {
DetailContract(contract: contract)
} label: {
Label (...)
}
因此,在视图1中,我将合约传递给视图2
视图2(部分):
struct DetailContract: View {
@Environment(\.managedObjectContext) var moc
@State var contract: FetchedResults<Contract>.Element
@State var showClientDetailSheet: Bool = false
var body: some View {
NavigationStack {
List {
Section {
HStack {
Text("Client: \(contract.wrappedClientName)")
Spacer()
Button {
showClientDetailSheet.toggle()
} label: {
Image(systemName: "info.circle")
}
}
}
.navigationTitle("Details")
.sheet(isPresented: $showClientDetailSheet) {
DetailClient(client: contract.client)
}
}
}
}
详细客户端视图中的“客户端”为:
struct DetailClient: View {
@State var client: FetchedResults<Client>.Element
var body: some View {
NavigationStack {
List {
Text(client.name ?? "")
Text(client.address ?? "")
Text(client.idNumber ?? "")
}
}
}
}
谢谢!希望您理解,我是新使用的核心数据,还在学习!
1条答案
按热度按时间k3bvogb11#
我的客户是零,但我也想明白了。
不需要在子类文件中展开。
当我保存合约实体时,我没有调用“contract.client?.attribute”。
我没有这么做:
现在,我更改了DetailClient视图,将客户机的属性作为参数(字符串),并打开了String选项。
感谢您抽出宝贵时间!