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

alice_ix

我在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()
    }

}
}

这是一种观点,我可以抓住这一点的价值变化

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)
        }
    }
}
}

请帮帮我。

他的脾气

它使用的两个不同实例SettingCodeTwo-在中的NetworkNamager另一个实例SettingsView,因此如果同时创建它们,则不会同步。

这是一种使这两个实例保持自我同步的方法(这可能是因为它们使用相同的存储- UserDefaults

经过Xcode 11.4 / iOS 13.4测试

下面的修改后的代码(另请参见重要的内联注释)

extension UserDefaults { 
    @objc dynamic var textKey2: String { // helper keypath 
        return string(forKey: "textKey2") ?? ""
    }
}

class SettingCodeTwo: ObservableObject { // use capitalised name for class !!!

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

    private var canc: AnyCancellable!
    private var observer: NSKeyValueObservation!

    init() {
        canc = $text.debounce(for: 0.2, scheduler: DispatchQueue.main).sink { newText in
            UserDefaults.standard.set(newText, forKey: SettingCodeTwo.userDefaultTextKey)
        }
        observer = UserDefaults.standard.observe(\.textKey2, options: [.new]) { _, value in
            if let newValue = value.newValue, self.text != newValue { // << avoid cycling on changed self
                self.text = newValue
            }
        }
    }
}

class NetworkManager: ObservableObject {

    var codeTwo = SettingCodeTwo() // no @ObservedObject needed here
    ...

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

SwiftUI 观察到的对象未更新

当观察到的对象发生变化时,SwiftUI NavigationView 会弹出

每次观察到订阅时如何运行函数

如何从有前景的函数中返回可观察到的

Blazor await JSRuntime.InvokeAsync<string> 在 C# 中捕获图像 src 当我可以观察到正在捕获的 JS 值时返回 null

测试协程中可观察到的场变化

@ ionic-native /从可观察到的网络值捕获

尝试从JSON数组获取对象值时观察到空指针

如果可观察到的结果等于某个值,如何退出函数

SwiftUI观察到变量后如何立即触发操作

使用Internet Explorer观察到,在硒中调用函数时SessionNotFoundException

垫台变化可观察到

观察到值时的 VBA 修改范围

如何在Javascript中返回对函数的引用(可观察到的敲除)

观察对象的值变化

如何对数据中的关系进行排序,以便先前观察到的值首先出现

如何在Angular Jasmine Spec中测试主题和可观察到的返回值?

在python中遍历列表时观察到奇怪的行为

如何从订阅中返回可观察到的

如何停止Rxjs中可观察到的共享

Mobx 和 React。可观察到的变化后如何处理焦点输入?

可以观察到的变化,但不会在敲门通知中通知订户

在Angular2中可观察到的组件属性变化

当观察到特定值时,对另一列中的一列进行编码 r

我如何在可编辑字段中显示可观察到的值而不更改该值

可观察到对象数组的映射

函数执行后如何防止对象变化?

从异步函数返回可观察到的

SwiftUI:当观察到的对象从另一个文件更改时,视图不更新