Отключить навигационное представление при удалении объекта Core Data - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь использовать SwiftUI и CoreData для создания приложения MacOS. Главное окно этого приложения имеет NavigationView, с элементами списка, связанными с запросом на выборку, и выбор любого из этих элементов заполняет подробный вид. Вид навигации выглядит примерно так:

NavigationView {
    VStack(spacing: 0) {
        List(fetchRequest) { DetailRow(model: $0) }
            .listStyle(SidebarListStyle())

        HStack {
            Button(action: add) { Text("+") }
            Button(action: remove) { Text("-") }
        }
    }

    Text("Select a model object")
}.navigationViewStyle(DoubleColumnNavigationViewStyle())

DetailRow - это NavigationLink, который также определяет подробный вид:

NavigationLink(destination: ModelDetail(model: model)) {
    Text(model.name)
}

Я считаю, что содержимое ModelDetail не очень важно;в любом случае, я довольно гибок в этом.

В представлении навигации кнопка «-», которая вызывает метод remove, должна удалить выбранный в данный момент объект модели и вернуться к значению по умолчанию,пустой подробный вид. К сожалению, я изо всех сил пытаюсь найти правильный способ сделать это. Я считаю, что мне нужно, чтобы происходили следующие взаимодействия:

  1. подпредставление сообщает навигационному представлению, какой объект модели в данный момент выбран
  2. пользователь нажимает кнопку "-", метод remove в навигационном представленииудаляет текущий выбранный объект.
  3. замечает, что его объект модели удаляется
  4. → вызовы подпредставления PresentationMode.dismiss()

Шаг 3 - это тот, с которым я борюсь,Пока все работает нормально, без использования классов модели представления поверх классов Core Data, но я застрял, пытаясь понять, как заставить подпредставление вызвать dismiss(). Это должно происходить в подробном виде, потому что он получает PresentationMode из среды, а NavigationView меняет его.

Хотя я могу получить Binding для свойства isDeleted модели через@ObservedObject, я не знаю, как я могу на самом деле реагировать на это изменение;Binding, похоже, использует скрытых издателей, но они не раскрывают издателя, к которому я мог бы подключиться, например, с помощью onPublish.

KVO over isDeleted может быть возможным, но прослушиваниеиз типа значения не велика;нет подходящего места для удаления наблюдателя, что могло бы стать проблематичным, если бы приложение работало слишком долго.

Каковы рекомендации для такого типа проблем?

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