我有这段代码:
TypeConverters
此代码的目的是首先检索“ usta”集合中的所有数据。然后将其分配给ustaList,最后在@State var ustasList: Array<Usta> = []
func getUstalar() -> Array<Usta>{
var templist: Array<Usta> = []
DispatchQueue.main.async {
self.db.collection("ustas").getDocuments(){ (querysnapshot,err) in
for document in querysnapshot!.documents {
let data = document.data()
let newUsta = Usta(id: UUID(), name: data["name"] as! String, type: data["type"] as! String,telephone: data["telephone"] as! String)
templist.append(newUsta)
}
}
}
return templist
}
var body: some View {
NavigationView{
List{
ForEach(0..<self.ustasList.count){ i in
Text(self.ustasList[i].name)
}
}
}
.onAppear(){
self.ustasList = self.getUstalar()
}
}
中显示ustaList
中的元素。但是,List
需要花费一些时间来执行,因此List不会显示任何内容。如何确保ustaList更新后,List显示数据。通常会快速移动,但是会自动更新。
答案 0 :(得分:1)
确保将语句包装在Group
中,并使用if
检查是否有可用的内容。确保使用onAppear
上的Group
。像这样(经过测试并在iOS 13.5上运行):
struct ContentView: View {
@State var stringArray: Array<String> = []
func getSomeInformation() {
// Wait for 2 seconds then append items
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
self.stringArray.append("a")
self.stringArray.append("b")
self.stringArray.append("c")
}
}
var body: some View {
Group { // Group all
if self.stringArray.count > 0 { // Use if statement to check for content
NavigationView() {
List() {
ForEach(self.stringArray, id: \.self) { item in
Text(item).foregroundColor(Color.black)
}
}
}
}
}.onAppear() {
self.getSomeInformation()
}
}
}
有一种无需使用Group
和if
语句的方法。如果对id
的更改是这样的,请在ForEach语句中使用@State
来使其区分并更新视图:
struct ContentView: View {
@State var stringArray: Array<String> = []
func getSomeInformation() {
// Wait for 2 seconds then append items
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
self.stringArray.append("a")
self.stringArray.append("b")
self.stringArray.append("c")
}
}
var body: some View {
NavigationView() {
List() {
ForEach(self.stringArray, id: \.self) { item in
Text(item).foregroundColor(Color.black)
}
}
}.onAppear() {
self.getSomeInformation()
}
}
}