नेवेस्टेबल ओब्जेक्ट्स को बांधने के लिए स्विफ्टुई के विचारों को कैसे बताया जाए


18

मेरे पास एक स्विफ्टयूआई दृश्य है जिसे एक एन्वायर्नमेंट ऑबजेक्ट में लिया जाता है appModel। यह तब appModel.submodel.countइसकी bodyविधि में मूल्य पढ़ता है । मैं उम्मीद करता हूं कि यह मेरे विचार को संपत्ति countपर बांध देगा submodelताकि यह संपत्ति के अद्यतन के समय पुन: प्रतिपादन करे, लेकिन ऐसा होता नहीं दिख रहा है।

क्या यह एक बग है? और यदि नहीं, तो मुहावरेदार तरीका क्या है कि स्विफ्टयूआई में पर्यावरण की वस्तुओं के निहित गुणों के साथ विचार किया जाए?

विशेष रूप से, मेरा मॉडल इस तरह दिखता है ...

class Submodel: ObservableObject {
  @Published var count = 0
}

class AppModel: ObservableObject {
  @Published var submodel: Submodel = Submodel()
}

और मेरा नज़रिया ऐसा दिखता है ...

struct ContentView: View {
  @EnvironmentObject var appModel: AppModel

  var body: some View {
    Text("Count: \(appModel.submodel.count)")
      .onTapGesture {
        self.appModel.submodel.count += 1
      }
  }
}

जब मैं ऐप चलाता हूं और लेबल पर क्लिक करता हूं, तो countसंपत्ति बढ़ जाती है लेकिन लेबल अपडेट नहीं होता है।

मैं इसे appModel.submodelएक संपत्ति के रूप में पास करके इसे ठीक कर सकता हूं ContentView, लेकिन यदि संभव हो तो मैं ऐसा करने से बचना चाहता हूं।


मैं भी इस तरह से अपना ऐप डिजाइन कर रहा हूं। मेरे पास आमतौर पर पिछले एप्लिकेशन विकास में एक वैश्विक ऐप ऑब्जेक्ट है। क्या कोई अन्य व्यक्ति "सुपर" ऐप के इस डिजाइन को वर्ग के रूप में सोचता है क्योंकि पर्यावरण चर मानक अभ्यास बन जाएगा? मैं भी कई EnvironmentObjects का उपयोग करने पर विचार कर रहा था, लेकिन इसे बनाए रखना कठिन है।
माइकल ओजेरानस्की

जवाबों:


22

स्विफ्टयूआई में नेस्टेड मॉडल अभी तक काम नहीं करते हैं, लेकिन आप ऐसा कुछ कर सकते हैं

class Submodel: ObservableObject {
    @Published var count = 0
}

class AppModel: ObservableObject {
    @Published var submodel: Submodel = Submodel()

    var anyCancellable: AnyCancellable? = nil

    init() {
        anyCancellable = submodel.objectWillChange.sink { (_) in
            self.objectWillChange.send()
        }
    } 
}

मूल रूप से आपका AppModelईवेंट ईवेंट को कैच करता है Submodelऔर उसे व्यू में भेजता है

संपादित करें:

यदि आपको SubModelक्लास करने की आवश्यकता नहीं है , तो आप कुछ इस तरह की कोशिश कर सकते हैं:

struct Submodel{
    var count = 0
}

class AppModel: ObservableObject {
    @Published var submodel: Submodel = Submodel()
}

धन्यवाद, यह मददगार है! जब आप कहते हैं "स्विफ्टयूआई में नेस्टेड मॉडल अभी तक काम नहीं करते हैं", तो क्या आप यह सुनिश्चित करने के लिए जानते हैं कि वे योजनाबद्ध हैं?
rjkaplan

मुझे यकीन नहीं है, लेकिन मेरी राय में यह काम करना चाहिए, मैं अपने प्रेज में भी कुछ इसी तरह का उपयोग करता हूं, इसलिए अगर मुझे एक बेहतर दृष्टिकोण मिलेगा तो मैं एक संपादन के साथ
आऊंगा

@SorinLica टाइप होना Submodelचाहिए ObservableObject ?
फरहान अमजद

यह काम कर रहा है! बहुत बढ़िया समाधान!
एमडी शाहिद हुसैन

1

सभी तीन ViewModels संवाद और अद्यतन कर सकते हैं

// First ViewModel
class FirstViewModel: ObservableObject {
var facadeViewModel: FacadeViewModels

facadeViewModel.firstViewModelUpdateSecondViewModel()
}

// Second ViewModel
class SecondViewModel: ObservableObject {

}

// FacadeViewModels Combine Both 

import Combine // so you can update thru nested Observable Objects

class FacadeViewModels: ObservableObject { 
lazy var firstViewModel: FirstViewModel = FirstViewModel(facadeViewModel: self)
  @Published var secondViewModel = secondViewModel()
}

var anyCancellable = Set<AnyCancellable>()

init() {
firstViewModel.objectWillChange.sink {
            self.objectWillChange.send()
        }.store(in: &anyCancellable)

secondViewModel.objectWillChange.sink {
            self.objectWillChange.send()
        }.store(in: &anyCancellable)
}

func firstViewModelUpdateSecondViewModel() {
     //Change something on secondViewModel
secondViewModel
}

कंबाइन सॉल्यूशन के लिए धन्यवाद सोरिन।


क्या आप कोड अपडेट कर सकते हैं? इसमें कई संकलक त्रुटियाँ हैं
DevB2F

-2

यह बग जैसा दिखता है। जब मैं नवीनतम संस्करण में xcode को अपडेट करता हूं, तो नेस्टेड ऑब्जर्बऑब्जेक्ट के लिए बाध्य करते समय यह सही ढंग से काम करता है


क्या आप स्पष्ट कर सकते हैं कि उस कार्य पर वर्तमान में आपका कौन सा xcode संस्करण है? मेरे पास वर्तमान में Xcode 11.0 है और इस समस्या का अनुभव करता हूं। मुझे 11.1 पर अपग्रेड करने में परेशानी हो रही है, यह 80% पूर्ण की तरह अतीत नहीं मिलेगा।
माइकल ओजेरानस्की
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.