নেস্টেড অবজারভেবলঅবজেক্টগুলিকে আবদ্ধ করতে কীভাবে সুইফটুআই ভিউগুলি বলতে হয়


18

আমি একটি SwiftUI দৃশ্য যে EnvironmentObject নামক লাগে appModel। এটি appModel.submodel.countতার bodyপদ্ধতিতে মানটি পড়ে reads আমি এই সম্পত্তি আমার দৃশ্য বাঁধে আশা 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, তবে আমি যদি সম্ভব হয় তবে এড়াতে চাই।


আমি আমার অ্যাপটিও এর মতো ডিজাইন করছি। বিগত অ্যাপ্লিকেশন বিকাশে আমার সাধারণত একটি গ্লোবাল অ্যাপ অবজেক্ট থাকে। পরিবেশের পরিবর্তনশীল হিসাবে সুপার "অ্যাপ" শ্রেণির এই নকশাটি কি অন্য কেউ ভাবেন যে স্ট্যান্ডার্ড অনুশীলন হয়ে উঠবে? আমি একাধিক এনভায়রনঅবজেক্টগুলি ব্যবহার করার বিষয়েও বিবেচনা করছিলাম তবে এটি বজায় রাখা কঠিন ছিল।
মাইকেল ওজারিয়ানস্কি

উত্তর:


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

আমি নিশ্চিত নই, তবে আমার মতে এটির কাজ করা উচিত, আমি আমার প্রজেক্টেও অনুরূপ কিছু ব্যবহার করি, তাই যদি আমি আরও ভাল পদ্ধতির সন্ধান পাই তবে আমি একটি সম্পাদনা নিয়ে আসব
Sorin Lica

@ সোরিনলিকা Submodelকি ObservableObject টাইপ করা উচিত?
ফারহান আমজাদ

ইহা কাজ করছে! অসাধারণ সমাধান!
মোঃ শাহেদ হোসেন

1

তিনটি ভিউমোডেলই যোগাযোগ করতে এবং আপডেট করতে পারে

// 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

এটি বাগের মতো দেখাচ্ছে। আমি যখন এক্সকোডটিকে সর্বশেষতম সংস্করণে আপডেট করি তখন নেস্টেড অবজারভেবলবজেক্টগুলিতে আবদ্ধ হওয়ার সাথে সাথে এটি সঠিকভাবে কাজ করে


আপনি বর্তমানে কোন এক্সকোড সংস্করণে কাজ করছেন তা স্পষ্ট করে বলতে পারেন? আমার কাছে বর্তমানে এক্সকোড 11.0 আছে এবং এই সমস্যাটি অনুভব করছি। ১১.১-তে উন্নীত করতে আমার সমস্যা হয়েছে, এটি ৮০% সম্পূর্ণের মতো শেষ হবে না।
মাইকেল ওজেরিয়ানস্কি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.