gpt4 book ai didi

ios - SwiftUI:绑定(bind)值更改时如何发出网络请求?

转载 作者:行者123 更新时间:2023-12-01 21:46:49 25 4
gpt4 key购买 nike

当我滑动到 PagerView 中的另一个页面时,我正在尝试更新我的图 TableView 。当我滑动 currentIndex 更改时。但我不明白如何在 currentIndex 更改时得到通知。这是我的代码:

struct MainView: View {

let network = Network()

@State private var currentIndex: Int = 0
@State private var sources: [Source] = []

var body: some View {
return ZStack {
...
VStack {
Text("Температура")
.defaultFont(font: .system(size: 30), weight: .regular)

PagerView(pagesCount: self.sources.count, currentIndex: self.$currentIndex) {
ForEach(self.sources, id: \.self) { t in
...
}
}

if !sources.isEmpty {
ChartView(sourceId: $sources[currentIndex].id)
} else {
Spacer()
}
}
}
}

}

PagerView 绑定(bind)到 currentIndex,所以当我滑动页面时 currentIndex 发生变化。 ChartView 有一个方法 loadData 并且我想在我滑动页面加载新图表时调用它取决于 sources[currentIndex].id。这是 ChartView 的代码:

struct ChartView: View {

@Binding var sourceId: String {
didSet {
loadData()
}
}
@State private var points: [TemperaturePoint] = []

var body: some View {
GeometryReader { proxy in
ChartView.makePath(by: self.points, with: proxy)
.stroke(Color.white, lineWidth: 2)
}.onAppear(perform: loadData)
}

func loadData() {
network.getPoints(sourceId: sourceId) { response in
switch response {
case .result(let array):
self.points = TemperaturePoint.smooth(points: array.results)

case .error(let error):
print(error)
}
}
}

}

那么问题是当Binding变量改变时如何进行网络调用呢?或者,也许我弄错了,需要使用另一种方式来对此进行编码。

最佳答案

当绑定(bind)状态改变时,只调用带有@Binding 的 View 的body,即。实际上只有刷新发生,并且只有部分依赖于绑定(bind)状态,所以即使 .onAppear 也不会被调用。

考虑到整个 ChartView 依赖于新标识符这一事实,解决方案是强制刷新整个 View ,因此再次调用 .onAppear,并加载新数据。

这是代码。使用 Xcode 11.4/iOS 13.4(带有一些简化的复制版本)进行测试。

struct ChartView: View {

@Binding var sourceId: String // << just binding
@State private var points: [TemperaturePoint] = []

var body: some View {
GeometryReader { proxy in
ChartView.makePath(by: self.points, with: proxy)
.stroke(Color.white, lineWidth: 2)
}
.id(sourceId) // << here !!
.onAppear(perform: loadData)
}

func loadData() {
network.getPoints(sourceId: sourceId) { response in
switch response {
case .result(let array):
self.points = TemperaturePoint.smooth(points: array.results)

case .error(let error):
print(error)
}
}
}
}

关于ios - SwiftUI:绑定(bind)值更改时如何发出网络请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62157313/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com