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

标签 ios swift xcode swiftui

这是我为这两个类编写的代码。我不确定这里发生了什么? 文本字段未更新 @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/

相关文章:

ios - 如何使用滑动手势移动 Sprite ?

ios - Swift NSNotificationCenter 不会触发

ios - 解锁 UINavigationController 中的内容

ios - 有什么工具可以找出两个 xcode 项目之间的区别吗?

swift - 如何在 Swift 中结合 NavigationController 的两个 ViewController 之间切换

objective-c - UIImageView焦点效果

swift - 委托(delegate)方法不会被第二次调用

ios - 隐藏 UIToolBar 和 UINavigation 并展开 UIWebView? - iOS

ios - 无法在 xcode 6 中创建 ipa?

ios - 在 Collection View 的 cellForItemAtIndexPath 方法中更改框架