0

It takes data in my @Published variable in CarDetailViewModel, but I could not pass the data inside this variable to the variable in the ViewController.

ViewModel:

class CarDetailViewModel: ObservableObject {
    @Published var carDetail: Car = Car(brand: "", features: CarFeatures(model: "", km: 0, year: 0, price: 0, image: "", gearType: "", fuelType: "", carVersion: ""))
    
    private var anyCancellable = Set<AnyCancellable>()
    var carSubject = PassthroughSubject<Car, Never>()
    
    func prepareCarDetail() {
        carSubject
            .sink {[weak self] car in
                self?.carDetail = car
                print("car: \(self?.carDetail)") // it is working.
            }
            .store(in: &anyCancellable)
    }
}

ViewController:

When the assignmentDataToUI function runs, the label on the screen is blank.

class CarDetailViewController: UIViewController {
    
    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var brandLabel: UILabel!
    @IBOutlet weak var modelLabel: UILabel!
    @IBOutlet weak var gearTypeLabel: UILabel!
    @IBOutlet weak var fuelTypeLabel: UILabel!
    @IBOutlet weak var priceLabel: UILabel!
    
    var carDetailViewModel = CarDetailViewModel()
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        carDetailViewModel.prepareCarDetail()
        assignmentDataToUI()
        
    }
    
    func assignmentDataToUI() {
        brandLabel.text = carDetailViewModel.carDetail.brand
    }
}
Ufuk Köşker
  • 1,288
  • 8
  • 29

2 Answers2

1

I listened to carDetail in ViewModel with sink.

 carDetailViewModel.$carDetail
                .sink {[weak self] car in
                    guard let self = self else { return }
                    self.assignmentDataToUI()
                }
                .store(in: &anyCancelable)
Ufuk Köşker
  • 1,288
  • 8
  • 29
0

In ViewModel

 @Published var text: String = "befor"

In ViewController

private var cancellables = Set<AnyCancellable>()

......

viewModel.$text.sink { text in
   print(text)
}.store(in: &cancellables)
Deep
  • 416
  • 6
  • 15