Отображение индикатора активности при извлечении данных api

#swift #swiftui

Вопрос:

Я заполняю это Picker данными из своего api

 var body: some View {
        NavigationView {
            Form {
                Section(header: Text("Pesquisar Denúncia")) {
                //some code...
                    Picker(selection: $tipoDenunciaSelecionada, label: Text("Tipo de Denúncia")) {
                        ForEach(tiposDenuncia, id: .self) {item in
                            Text(item.nome ?? "")
                        }
                    }.onAppear(perform: carregarTipoDenuncia)
                   
             //some more code...
       }
    }
 

Для получения данных я сделал это func

 func carregarTipoDenuncia()  {
        self.estaCarregando = true
        let oCodigo_Entidade = UserDefaults.standard.integer(forKey: "codigoEntidade")
        
        guard let url = URL(string: "url here") else {
            print("Erro ao conectar")
            return
        }
        let request = URLRequest(url: url)
        let task = URLSession.shared.dataTask(with: request) {data, response, error in
            let decoder = JSONDecoder()
            if let data = data {
                do {
                    let response = try decoder.decode([TipoDenunciaModel].self, from: data)
                    DispatchQueue.main.async {
                        self.tiposDenuncia = response
                    }
                    
                    return
                } catch  {
                    print(error)
                }
            }
            
        }
       
        task.resume()
    }
 

но теперь я не знаю, как отобразить индикатор загрузки данных.
Я попытался добавить логическую переменную состояния и манипулировать ею после ответа, чтобы показать/скрыть actionsheet , но это не сработало, лист действий не исчез.
Мне нужно, чтобы пользователь выбрал хотя бы один из вариантов этого средства выбора.
Как я могу отобразить какой-либо индикатор загрузки данных?

Ответ №1:

Как вы можете показать любое представление, body добавьте логическую @State переменную с начальным значением true и покажите представление прогресса. После загрузки данных установите переменную, в false которую отображается средство выбора.

Переместите .onAppear модификатор в положение после Form .

 var body: some View {
    @State private var isLoading = true
    // @State private var tipoDenunciaSelecionada ...

        NavigationView {
            Form {
                Section(header: Text("Pesquisar Denúncia")) {
                //some code...
                    if isLoading {
                        HStack(spacing: 15) {
                            ProgressView()
                            Text("Loading…")
                        }
                    } else {
                        Picker(selection: $tipoDenunciaSelecionada, label: Text("Tipo de Denúncia")) {
                            ForEach(tiposDenuncia, id: .self) {item in
                                Text(item.nome ?? "")
                            }
                    }
                   
             //some more code...
            }.onAppear(perform: carregarTipoDenuncia)
       }
    }
}
 

 let response = try decoder.decode([TipoDenunciaModel].self, from: data)
     DispatchQueue.main.async {
        self.tiposDenuncia = response
        self.isLoading = false
     }
...
 

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

1. приятно, что перемещение onAppear в форму решило проблему

Ответ №2:

Вы можете использовать определенный SwiftUI ProgressView , как показано здесь.

Пример использования:

 import SwiftUI

struct ActivityIndicator: View {
    @State private var someVar: CGFloat = 0.0 //You'll need some sort of progress value from your request

    var body: some View {
        ProgressView(value: someVar)
    }
}