Как заменить @FetchRequest динамическим вызовом c - PullRequest
0 голосов
/ 22 февраля 2020

У меня есть этот код в моем проекте 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 динамически, чтобы завершить просмотр Picker при перезагрузке, когда SettingsView закрывается. Возможно, мне следует использовать @ObservableObject, но как поместить туда запрос на выборку и использовать результат в представлении выбора для ForEach? Спасибо за подсказки.

Ответы [ 3 ]

0 голосов
/ 23 февраля 2020

Я переработал код, подобный этому

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
}

, но он сообщает о фатальной ошибке «Поток 1: EXC_BAD_INSTRUCTION (code = EXC_I386_INVOP, subcode = 0x0)» в строке ForEach при запуске.

0 голосов
/ 23 февраля 2020

В SettingsView я удаляю все данные в сущности Country, анализирую файл JSON, хранящийся в моем iCloud, и сохраняю все данные в сущности Country.

0 голосов
/ 22 февраля 2020

Вы можете настроить большую часть вашего FetchRequest:

@FetchRequest(entity: Country.entity(),
          sortDescriptors:  ObservableObject.sortDesc,
          predicate : ObservableObject.predicate
  ) var countries: FetchedResults<Country>
...