#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)
}
}