gpt4 book ai didi

ios - SwiftUI:执行函数时如何从观察到的对象中捕获变化的值

转载 作者:行者123 更新时间:2023-12-01 17:46:07 26 4
gpt4 key购买 nike

我在 SwiftUI 中观察到的对象有问题。
我可以在 View 结构上看到观察对象的值发生变化。
但是在类或函数中,即使我更改了 TextField(这是可观察对象)的文本值,但“self.codeTwo.text”仍然没有改变。

这是我的代码示例(这是我的 ObservableObject)

class settingCodeTwo: ObservableObject {

private static let userDefaultTextKey = "textKey2"
@Published var text: String = UserDefaults.standard.string(forKey: settingCodeTwo.userDefaultTextKey) ?? ""

private var canc: AnyCancellable!

init() {
canc = $text.debounce(for: 0.2, scheduler: DispatchQueue.main).sink { newText in
UserDefaults.standard.set(newText, forKey: settingCodeTwo.userDefaultTextKey)

}
}


deinit {
canc.cancel()
}

}

主要问题是......“self.codeTwo.text”从未改变!
class NetworkManager: ObservableObject {


@ObservedObject var codeTwo = settingCodeTwo()
@Published var posts = [Post]()


func fetchData() {
var urlComponents = URLComponents()
urlComponents.scheme = "http"



urlComponents.host = "\(self.codeTwo.text)" //This one I want to use observable object




urlComponents.path = "/mob_json/mob_json.aspx"
urlComponents.queryItems = [
URLQueryItem(name: "nm_sp", value: "UP_MOB_CHECK_LOGIN"),
URLQueryItem(name: "param", value: "1000|1000|\(Gpass.hahaha)")
]

if let url = urlComponents.url {
print(url)
let session = URLSession(configuration: .default)
let task = session.dataTask(with: url) { (data, response, error) in
if error == nil {
let decoder = JSONDecoder()
if let safeData = data {
do {
let results = try decoder.decode(Results.self, from: safeData)

DispatchQueue.main.async {
self.posts = results.Table
}
} catch {
print(error)
}
}
}
}
task.resume()
}

}
}

这是 View ,我可以捕捉到这个值的变化
import SwiftUI
import Combine



struct SettingView: View {

@ObservedObject var codeTwo = settingCodeTwo()
var body: some View {
ZStack {
Rectangle().foregroundColor(Color.white).edgesIgnoringSafeArea(.all).background(Color.white)
VStack {


TextField("test", text: $codeTwo.text).textFieldStyle(BottomLineTextFieldStyle()).foregroundColor(.blue)

Text(codeTwo.text)
}
}
}
}

请帮帮我。

最佳答案

非 SwiftUI 代码

  • 使用ObservedObject仅适用于 SwiftUI,您的函数/其他非 SwiftUI 代码不会对更改使用react。
  • 使用像 Sink 这样的订阅者观察任何发布者的变化。 (每个 @Published 变量都有一个发布者作为包装值,您可以通过前缀 $ 符号来使用它。
  • SwiftUI 的原因查看对类属性更改没有反应:
  • struct是一个值类型,所以当它的任何属性发生变化时,struct 的值已更改
  • class是一个引用类型,当它的任何属性发生变化时,底层的 class实例仍然相同。
  • 如果您分配一个新的类实例,那么您会注意到 View 对更改使用react。

  • 方法:
  • 使用单独的 View 并接受 codeTwoText@Binding那样当codeTwoText更改 View 将更新以反射(reflect)新值。
  • 您可以将模型保留为一个类,因此那里没有任何变化。

  • 例子
    class Model : ObservableObject {

    @Published var name : String //Ensure the property is `Published`.

    init(name: String) {
    self.name = name
    }
    }

    struct NameView : View {

    @Binding var name : String

    var body: some View {

    return Text(name)
    }
    }

    struct ContentView: View {

    @ObservedObject var model : Model

    var body: some View {
    VStack {
    Text("Hello, World!")
    NameView(name: $model.name) //Passing the Binding to name
    }
    }
    }

    测试
    struct ContentView_Previews: PreviewProvider {
    static var previews: some View {

    let model = Model(name: "aaa")

    DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
    model.name = "bbb"
    }

    return ContentView(model: model)
    }
    }

    关于ios - SwiftUI:执行函数时如何从观察到的对象中捕获变化的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61335519/

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