Представление представлений с использованием связанного значения enum case

#swift #swiftui

#swift #swiftui

Вопрос:

Я передаю объект модели coredata ( ItemModel ), используя перечисления, подобные этому

 .sheet(item: $activeSheet, onDismiss: { self.activeSheet = nil }) { item in

            switch item {
            case .newDoc:
                NewDocumentView(ref: nil).environment(.managedObjectContext, context)
            case .detailFolder(let data):
                DetailedFolderView(item: data, dirName: data.wrappedName, updater: viewUpdater).environment(.managedObjectContext, context)
            case .detailDoc(let file):
                DetailDocumentView(item: file, fileName: file.wrappedItemName)
                    .environment(.managedObjectContext, context)
            }
        }
  

но пока я пытаюсь обновить ItemModel объект в контексте DetailDocumentView использования управляемого объекта после сохранения и отклонения представления родительский вид не обновляется, представление обновляется только после перезапуска приложения

Может кто-нибудь предложить способ обновления родительского представления после обновления объекта передаваемой модели coredata( ItemModel ) DetailDocumentView . Любые предложения приветствуются 🙂

Застрял на этой проблеме в течение нескольких часов, пытался использовать наблюдаемые объекты, пытался использовать издателя при обновлении контекста, но до сих пор работал: (

Вот ссылка на код, используемый при нажатии на файл для представления DetailDocumentView

 /// creates a grid to display data
    /// - Parameters:
    ///   - geometry: setup dimension for the grid view
    ///   - folders: files required
    /// - Returns: returns a grid
    private func gridView(_ geometry: GeometryProxy, files: FetchedResults<ItemModel>) -> some View {
        QGrid(files,
              columns: 2,
              columnsInLandscape: 0,
              vSpacing: 20,
              hSpacing: 35,
              vPadding: 10,
              hPadding: 10,
              isScrollable: false,
              showScrollIndicators: false) { file in
            FileItemView(item: file)
                .environment(.managedObjectContext, context)
                .onTapGesture {
                    self.activeSheet = .detailDoc(file: file)
                }
        }
    }
  

Пример перечисления, который я использовал для представления нескольких листов, приведен ниже

 /// for presenting sheets
enum HomeViewActiveSheet: Any {
    case newDoc
    case detailFolder(folder: FolderModel)
    case detailDoc(file: ItemModel)
}

// so that it can be used in the .sheet init
extension HomeViewActiveSheet: Identifiable {
    var id: ObjectIdentifier {
        ObjectIdentifier(Self.self)
    }
}
  

И я объявляю его в родительском классе следующим образом:

 @State private var activeSheet: HomeViewActiveSheet? = .none
  

Комментарии:

1. Не могли бы вы показать больше кода? Как file здесь обстоят дела?

2. конечно, я добавил перечисление здесь