Я пытаюсь использовать 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
, должна удалить выбранный в данный момент объект модели и вернуться к значению по умолчанию,пустой подробный вид. К сожалению, я изо всех сил пытаюсь найти правильный способ сделать это. Я считаю, что мне нужно, чтобы происходили следующие взаимодействия:
- подпредставление сообщает навигационному представлению, какой объект модели в данный момент выбран
- пользователь нажимает кнопку "-", метод
remove
в навигационном представленииудаляет текущий выбранный объект. - замечает, что его объект модели удаляется
- → вызовы подпредставления
PresentationMode.dismiss()
Шаг 3 - это тот, с которым я борюсь,Пока все работает нормально, без использования классов модели представления поверх классов Core Data, но я застрял, пытаясь понять, как заставить подпредставление вызвать dismiss()
. Это должно происходить в подробном виде, потому что он получает PresentationMode
из среды, а NavigationView
меняет его.
Хотя я могу получить Binding
для свойства isDeleted
модели через@ObservedObject
, я не знаю, как я могу на самом деле реагировать на это изменение;Binding
, похоже, использует скрытых издателей, но они не раскрывают издателя, к которому я мог бы подключиться, например, с помощью onPublish
.
KVO over isDeleted
может быть возможным, но прослушиваниеиз типа значения не велика;нет подходящего места для удаления наблюдателя, что могло бы стать проблематичным, если бы приложение работало слишком долго.
Каковы рекомендации для такого типа проблем?