gpt4 book ai didi

ios - TextField Input 不更新其他类中的@Published ObservedObject (SwiftUI)

转载 作者:行者123 更新时间:2023-11-28 23:24:18 24 4
gpt4 key购买 nike

这是我为这两个类编写的代码。我不确定这里发生了什么?文本字段未更新 @Published 'cityInput' 变量。

我试图让用户输入他们所在城市的名称,然后使用该变量为他们输入的城市调用天气 API。但是,当我打印变量 (cityInput) 或使用它时,它仍然是默认值。它没有更新

import SwiftUI

struct ContentView: View {
@ObservedObject var networkingManager = NetworkingManager()

var body: some View {
NavigationView {
VStack {
Text("Please Enter a City Name")
TextField("City Name, i.e Sydney", text: $networkingManager.inputCity)
NavigationLink(destination: ForecastView()) {
Text("Go")
}
}
.padding()
.navigationBarTitle("Weather")
}
}
}

struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}


import Foundation
import SwiftUI
import Combine

class NetworkingManager : ObservableObject {
@Published var inputCity = "Sydney"
@Published var weatherList = [WeatherInfoList]()
var weatherCity = CityInformation(name: "Sydney", country: "AU")

func load() {
let apiKey = "d81d2f91438e7897ceb3c457c25"
guard let url = URL(string: "https://api.openweathermap.org/data/2.5/forecast?q=Sydney&units=metric&APPID=\(apiKey)") else {
return
}
print("City is: \(inputCity)")
URLSession.shared.dataTask(with: url) { (data, response, err) in
guard let data = data else { return }
let weatherInfo = try! JSONDecoder().decode(WeatherAPIResponse.self, from: data)
DispatchQueue.main.async {
self.weatherCity = weatherInfo.city
self.weatherList = weatherInfo.list
}
}.resume()
}
}



import SwiftUI

struct ForecastView: View {
@ObservedObject var networkingManager = NetworkingManager()

var body: some View {
NavigationView {
VStack {
List(networkingManager.weatherList, id: \.dt) { weather in
VStack(alignment: .leading) {
Text(weather.date)
.font(.headline)
Text("\(self.networkingManager.weatherCity.name), \(self.networkingManager.weatherCity.country)")
}
Spacer()
Text("\(weather.main.rTemp)°C ")
Image(systemName: "cloud.sun.fill")
}
}.onAppear() {
self.networkingManager.load()
}
.padding()
.navigationBarTitle("Weather Forecast")
}
}
}

struct ForecastView_Previews: PreviewProvider {
static var previews: some View {
ForecastView()
}
}

最佳答案

您不会回调 networkingManager.load() 当您完成编辑时,什么都不会改变.. 如果您打算在 ForecastView() 中显示预测详细信息?如果您尝试这样做,您需要使用 @Binding var details像这样传递网络管理器来传递它:

NavigationLink(destination: ForecastView(manager: networkingManager)) {
Text("Go")
}

struct ForecastView: View {
@ObservedObject var manager: NetworkingManager

var body: some View {
Text("Text").onAppear {
self.manager.load()
}
}
}

关于ios - TextField Input 不更新其他类中的@Published ObservedObject (SwiftUI),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59104353/

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