Как отобразить два 1-м связанных объекта CoreData в двух NSTableViews, используя привязки NSArray - PullRequest
0 голосов
/ 30 мая 2019

У меня есть сущность «персона» и 1-м связанный объект «визит», определенный в CoreData.Теперь я хочу отобразить и изменить их значения в связанных таблицах с помощью контроллеров NSArray с привязками COCOA на MacOS

Мой проект для MacOS, и я использую Xcode с Swift.Я определил структуру данных и объекты Viewcontroller, используя Xcode Builder.Таблица для «человека» уже работает, и я могу добавлять или удалять людей.Однако я не могу найти способ связать таблицу посещений с выбранным человеком.Я попробовал несколько вариантов, таких как подключение содержимого контроллера массива 'visit', как рекомендовано в Master-detail, с использованием привязок с двумя NSTableViews , но все это привело к ошибкам времени компиляции.

AsЯ работаю со сборщиками визуальных Xcode, на данный момент не так много кода.Вот что я сделал до сих пор:

Я определил два класса сущностей с помощью построителя модели данных XCode, затем две таблицы и контроллеры массивов с помощью построителя интерфейса раскадровки.Затем я связал содержимое табличных представлений с соответствующими контроллерами массива, а столбцы - с их собственным табличным представлением с соответствующим атрибутом сущности.Я также добавил кнопки + и -, чтобы добавить несколько строк.Пока все работало нормально.Но детали («визит») не имели никакого отношения к какому-либо «человеку».Поэтому я удалил все записи в таблице посещений и попытался привязать содержимое контроллера массива к выбранному человеку.Вот где я застреваю.Может быть, я пропустил некоторую инициализацию сущностей CoreData, но я понятия не имею, как поступить

1 Ответ

0 голосов
/ 30 мая 2019

Я смотрю на мой рабочий проект macOS, в котором есть два NSTableView в Master-Detail.

  • .xib имеет два контроллера массива, один для сущностей master и detail.Давайте назовем их MasterAC и DetailAC.Столбцы таблицы Master и Detail связаны с этими контроллерами массива.
  • В привязках для DetailAC привязка Content Array связана с: MasterAC.selection.details, где details - этоимя отношения мастер-деталь.
  • В привязках для MasterAC и DetailAC привязка Контекст управляемого объекта в обоих привязана к одному и тому же контексту управляемого объекта.
  • В контроллерах массива только эти две привязки ( Content Array и Контекст управляемых объектов ) связаны.

Если это не поможет, я могу еще немного покопаться.Привязки какао с основными данными в macOS прекрасны, как только вы их заработаете:))

Приложение.Если у вас есть упорядоченный набор

Если отношение мастер-деталь-ко-многим является неупорядоченным набором, и вы используете метод старой школы для определения атрибута index в вашей сущности DetailВы можете определить атрибут detailsOrdered в своем мастер-классе следующим образом:

func detailsOrdered() -> [Any]? {
    return details().arraySorted(byKeyPath: "index")
}

, а затем привязать к MasterAC.selection.detailsOrdered вместо MasterAC.selection.details.

Для реализации вышеупомянутого требуется следующеерасширение набора:

extension Set<AnyHashable> {
    func arraySorted(byKeyPath keyPath: String?) -> [Any]? {
        let unorderedArray = Array(self)
        let sortDescriptor = NSSortDescriptor(key: keyPath, ascending: true)
        let orderedArray = (unorderedArray as NSArray).sortedArray(using: [sortDescriptor])
        return orderedArray
    }
}
...