Как заменить @FetchRequest динамическим вызовом
У меня есть этот код в моем проекте SwiftUI, который хорошо работает
struct ContentView: View {
@State private var selectedCountry: Country?
@State private var showSetting = false
@FetchRequest(entity: Country.entity(),
sortDescriptors: [NSSortDescriptor(keyPath: \Country.cntryName, ascending: true)]
) var countries: FetchedResults<Country>
var body: some View {
NavigationView {
VStack {
Form {
Picker("Pick a country", selection: $selectedCountry) {
ForEach(countries, id: \Country.cntryName) { country in
Text(country.cntryName ?? "Error").tag(country as Country?)
}
}
if selectedCountry != nil {
DetailView(cntryName: (selectedCountry?.cntryName!)!)
}
}
}
.navigationBarTitle("UNECE Data")
.navigationBarItems(trailing: Button("Settings", action: {
self.showSetting.toggle()
}))
}
.sheet(isPresented: $showSetting) {
SettingsView(showSetting: self.$showSetting)
}
}
}
Однако мне нужно вызвать FetchRequest динамически завершить перезагрузку окна выбора, когда SettingsView отклоняется. Возможно, мне следует использовать @ObservableObject, но как поместить туда запрос на выборку и использовать результат в окне выбора ForEach? Спасибо за подсказки.
3 ответа
Вы можете настроить большую часть вашего FetchRequest:
@FetchRequest(entity: Country.entity(),
sortDescriptors: ObservableObject.sortDesc,
predicate : ObservableObject.predicate
) var countries: FetchedResults<Country>
В SettingsView я удаляю все данные в объекте Country, разбираю файл JSON, хранящийся в моем iCloud, и сохраняю все данные в объекте Country.
Я переработал такой код
var body: some View {
NavigationView {
VStack {
Form {
//Text(String(describing: countries.count))
Picker("Pick a country", selection: $selectedCountry) {
ForEach(getAllCountries().wrappedValue, id: \Country.cntryName) { country in
Text(country.cntryName ?? "Error").tag(country as Country?)
}
}
if selectedCountry != nil {
DetailView(cntryName: (selectedCountry?.cntryName!)!)
}
}
}
.navigationBarTitle("UNECE Data")
.navigationBarItems(trailing: Button("Settings", action: {
self.showSetting.toggle()
}))
}
.sheet(isPresented: $showSetting) {
SettingsView(showSetting: self.$showSetting)
}
}
func getAllCountries() -> FetchRequest<Country> {
let request = FetchRequest<Country>(entity: Country.entity(),
sortDescriptors: [NSSortDescriptor(keyPath: \Country.cntryName, ascending: true)])
return request
}
но он сообщает о фатальной ошибке "Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)" в строке ForEach при запуске.