网络请求后SwiftUI更新Elements.count

时间:2019-11-22 16:07:29

标签: ios swift swiftui swift5.1

我想用列更新自定义列表。

struct XyzView: View {
  @ObservedObject var networkManager: NetworkManager = NetworkManager()
  @State var maxrow : Int = 1

init() {
    maxrow = self.maxRow()
}

func maxRow() -> Int {
    let a = self.networkManager.products.count
    return a
}

    var body: some View {
Text("\(maxrow) Elements")

}

}

问题在于网络请求之后,计数未正确更新并重新加载视图。

DispatchQueue.main.async {
  self.products = products
 }

如何更新视图并将maxrow设置为当前products.count? 感谢帮助。

2 个答案:

答案 0 :(得分:1)

您在maxRow中使用的body没有得到更新。 您应该将视图直接绑定到products上,而不要尝试复制它:

{
     @ObservedObject var networkManager = NetworkManager()

     var maxRow: Int { networkManager.products.count }

     var body: some View {
         Text("\(maxRow) Elements")
     } 
}

答案 1 :(得分:0)

在Views中,在显示View时加载数据时使用.onAppear可能会更高效,更有效。

我将您的代码重新制作为以下内容:

struct XyzView: View {
  @ObservedObject var networkManager: NetworkManager = NetworkManager()
  @State var maxrow : Int = 1

func maxRow() -> Int {
    let a = self.networkManager.products.count
    return a
}

    var body: some View {
        Text("\(maxrow) Elements")
            .onAppear {
                self.maxrow = self.maxRow()
        }
    }
}

这应该像您想要的那样工作。

提示:如果您在NetworkManager模型中进行了任何更改,请确保进行了所有变量@Published以便View自行更新。