मैंने अपने ऐप के लिए EnvironmentObject में "स्टेट" ऑब्जेक्ट बनाया है:

class AppState: ObservableObject {
    @Published var counter = Counter()
}

इसे अपने ऐप में जोड़ने के लिए मैं इसका उपयोग करता हूं:

window.rootViewController = UIHostingController(rootView: contentView.environmentObject(state))

काउंटर एक पृष्ठभूमि कार्य है

class Counter: ObservableObject {

    @Published var ammount: Double

    var timer = Timer()

    init() {
        self.ammount = 0.0
        self.timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(setCoords), userInfo: nil, repeats: true)
    }

    @objc private func setCoords() {
        DispatchQueue.main.async() { () -> Void in
            self.ammount = self.ammount + 0.1
            print(self.ammount)
        }
    }  
}

और मेरे विचार में मेरे पास है:

struct ContentView: View {

    @EnvironmentObject var state: AppState
    @State var isVisible = true

    var body: some View {
        VStack {
            Button(action: {
                self.isVisible.toggle()
            }) {
               Text("Button")
            }
            if isVisible {
                Text(state.counter.ammount.description)
            }
        }
    }
}

तो मूल रूप से, मैं जो उम्मीद कर रहा था वह यह था कि मैं हर सेकेंड के बाद अपने यूआई अपडेट में काउंटर देखता हूं। लेकिन यूआई अपडेट नहीं होता है। मुझे हर सेकेंड में प्रिंट स्टेटमेंट में आग लगती है और अगर मैं यूआई बटन self.isVisible.toggle() से यूआई अपडेट को ट्रिगर करता हूं तो काउंटर भी अपडेट हो जाएगा।

मैं काउंटर को दृश्य में ले जाए बिना या इसे राज्य वस्तु में लागू किए बिना इस समस्या को कैसे हल कर सकता हूं?

1
M. P. 23 पद 2019, 11:24

1 उत्तर

सबसे बढ़िया उत्तर

आपका अनुमान सही नहीं है। आपने Counter को ObservableObject के रूप में बनाया है, लेकिन इसका कभी निरीक्षण नहीं किया।

state को @EnvironmentObject के रूप में बनाने पर आप var counter के गुणों में परिवर्तन देखते हैं, लेकिन इसके अंदर नहीं। यह वर्ग है, संदर्भ प्रकार है, संरचना नहीं है, इसलिए उदाहरण के आंतरिक गुणों के संशोधन के परिणामस्वरूप स्वयं उदाहरण का संशोधन नहीं होता है - संदर्भ वही रहता है, इसलिए state नहीं बदला जाता है।

यहां आपके स्नैपशॉट को काम करने का एक तरीका दिया गया है - निर्भर स्थानीय दृश्य स्थिति को देखने और अपडेट करने के लिए स्पष्ट प्रकाशक ईवेंट पेश करके:

@State var currentCounter: String = ""
var body: some View {
    VStack {
        Button(action: {
            self.isVisible.toggle()
        }) {
           Text("Button")
        }
        if isVisible {
            Text(currentCounter)
            .onReceive(state.counter.$ammount, perform: { value in
                self.currentCounter = value.description
            })
        }
    }
}
2
Asperi 23 पद 2019, 09:04