Список форм основных объектов данных с заголовками заголовков через отношения, игнорирующие объекты без связанных объектов - PullRequest
1 голос
/ 15 января 2020

Я пытаюсь отобразить основные данные в форме. У сущностей есть отношения один ко многим. Для демонстрации я сделал приложение, в котором есть Производители и два типа продуктов: Звездочки и Виджеты. Производители - это Одно, а Звездочки и Виджеты - Для Многих. Производители не имеют дубликатов, поэтому они не могут быть продублированы.

Я могу получить данные, чтобы отобразить, где имена производителей указаны в заголовке раздела, а продукты под ними. Проблема, с которой я сталкиваюсь, заключается в том, что хотя каждый производитель делает либо звездочку, либо виджет, либо и то и другое, они не все делают оба. Поэтому, когда я перечисляю данные, я получаю заголовки разделов для производителей, у которых нет продуктов под ними. На следующем снимке экрана видно, что Cogswell не создает виджеты, а Gotrockets не создает звездочки: enter image description here

Я бы не хотел, чтобы 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")
    }
}
}

Я искал, но не нашел решения этой проблемы. Заранее спасибо.

1 Ответ

1 голос
/ 15 января 2020

Вам необходимо отфильтровать manufacturers, чтобы исключить те, где количество виджетов (или звездочек) равно нулю. Примерно так:

ForEach(manufacturers.filter( { $0.wrappedManufacturerOfWidget.count > 0 }), id: \.self) { manufacturer in

Аналогично в ForEach для звездочек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...