Я пытаюсь быстро получить доступ к списку избранных элементов из основного вида с модальным листом. Избранные объекты хранятся в массиве EnvironmentObject
. На модальном листе есть кнопка, где вы можете в основном добавить / удалить объект из списка избранных. Однако при удалении элемента EnvironmentObject
становится пустым, и приложение вылетает:
Тема 1: Неустранимая ошибка: Нет ObservableObject
типа FavouritesList
найдено.
В журнале написано:
A View.environmentObject(_:)
для FavouritesList
может отсутствовать как предок этого представления. File
Как мне убедиться, что он возвращается к ContentView
естественным образом?
import SwiftUI
struct ContentView: View {
@EnvironmentObject var favouriteList: FavouritesList
@State private var presentingSheet = false
var body: some View {
NavigationView {
List {
NavigationLink(destination: JudgementsView()) {
Text("Judgements")
}
NavigationLink(destination: SecondaryView()) {
Text("Secondary acts")
}
ScrollView(.horizontal, showsIndicators: false) {
VStack {
if favouriteList.items.isEmpty {
Text("Nothing favoured")
} else {
ForEach(favouriteList.items, id: \.self) { id in
VStack {
HStack {
ForEach(judgementsTAXraw.filter {
$0.id == id
}) { judgement in
NavigationLink(destination: FileViewer(file: judgement.id)) {
Button(judgement.title) {
self.presentingSheet = true
}.sheet(isPresented: self.$presentingSheet) {
ModalSheet(file: judgement.CELEX)
}
}
}
}
HStack {
ForEach(secondaryTAXraw.filter {
$0.id == id
}) { secondary in
NavigationLink(destination: FileViewer(file: secondary.id)) {
Text(secondary.title).padding()
}
}
}
}
}
}
}
}
}
.navigationBarTitle(Text("Test"))
}
}
}
struct ModalSheet: View {
var file: String
@State private var showCopySheet = false
@EnvironmentObject var favouriteList: FavouritesList
var body: some View {
NavigationView {
Text("Modal").navigationBarItems(trailing:
Button(action: {
self.showCopySheet = true
}) {
Image(systemName: "doc.on.doc").frame(minWidth: 40)
}.actionSheet(isPresented: $showCopySheet) {
ActionSheet(title: Text("What do you want to do?"), buttons: [
.destructive(Text("favText"), action: {
if let index = self.favouriteList.items.firstIndex(of: self.file) {
self.favouriteList.items.remove(at: index)
} else {
self.favouriteList.items.append(self.file)
}
}),
.cancel()
])
}.frame(minWidth: 50)
)
}
}
}