Я пытаюсь отобразить основные данные в форме. У сущностей есть отношения один ко многим. Для демонстрации я сделал приложение, в котором есть Производители и два типа продуктов: Звездочки и Виджеты. Производители - это Одно, а Звездочки и Виджеты - Для Многих. Производители не имеют дубликатов, поэтому они не могут быть продублированы.
Я могу получить данные, чтобы отобразить, где имена производителей указаны в заголовке раздела, а продукты под ними. Проблема, с которой я сталкиваюсь, заключается в том, что хотя каждый производитель делает либо звездочку, либо виджет, либо и то и другое, они не все делают оба. Поэтому, когда я перечисляю данные, я получаю заголовки разделов для производителей, у которых нет продуктов под ними. На следующем снимке экрана видно, что Cogswell не создает виджеты, а Gotrockets не создает звездочки:
Я бы не хотел, чтобы Cogswell отображался в списке виджетов, а Gotrockets не отображается в списке звездочек, и я не могу понять, как структурировать, фильтровать или использовать предикат для этого. Я также пытался заставить другого вернуть только правильную информацию, но компилятор отказывается, понятно, когда я пытаюсь не возвращать представление для производителя без продукта. Мой текущий код такой:
struct ContentView: View {
@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(entity: Manufacturer.entity(), sortDescriptors: []) var manufacturers: FetchedResults<Manufacturer>
private var numberFormatter: NumberFormatter {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
return formatter
}
private var measurementFormatter: MeasurementFormatter {
let formatter = MeasurementFormatter ()
formatter.unitStyle = .short
return formatter
}
var body: some View {
NavigationView {
Form {
Text("Widgets:")
ForEach(manufacturers, id: \.self) { manufacturer in
Section(header: Text(manufacturer.wrappedName)) {
ForEach(manufacturer.wrappedManufacturerOfWidget, id: \.self) { widget in
Text("\(widget.wrappedTitle)")
}
}
}
Text("Sprockets:")
ForEach(manufacturers, id: \.self) { manufacturer in
Section(header: Text(manufacturer.wrappedName)) {
ForEach(manufacturer.wrappedManufacturerOfSprocket, id: \.self) { sprocket in
Text("\(sprocket.wrappedTitle)")
}
}
}
Button("Add Data") {
let spacely = Manufacturer(context: self.managedObjectContext)
spacely.name = "Spacely"
let cogswell = Manufacturer(context: self.managedObjectContext)
cogswell.name = "Cogswell"
let gotrockets = Manufacturer(context: self.managedObjectContext)
gotrockets.name = "Gotrockets"
let colossalSprocket = Sprocket(context: self.managedObjectContext)
colossalSprocket.id = UUID()
colossalSprocket.sprocketMadeBy = spacely
colossalSprocket.title = "Colossal Sprocket"
let cogSprocket = Sprocket(context: self.managedObjectContext)
cogSprocket.id = UUID()
cogSprocket.sprocketMadeBy = cogswell
cogSprocket.title = "CogSprocket"
let whizzoWidget = Widget(context: self.managedObjectContext)
whizzoWidget.id = UUID()
whizzoWidget.widgetMadeBy = gotrockets
whizzoWidget.title = "Whizzo Widget"
let uniblabWidget = Widget(context: self.managedObjectContext)
uniblabWidget.id = UUID()
uniblabWidget.widgetMadeBy = spacely
uniblabWidget.title = "Uniblab"
try? self.managedObjectContext.save()
}
}
.navigationBarTitle("Products")
}
}
}
Я искал, но не нашел решения этой проблемы. Заранее спасибо.