Reputation: 1480
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
}
}
Upvotes: 1
Views: 2601
Reputation: 436
In ViewModel
@Published var text: String = "befor"
In ViewController
private var cancellables = Set<AnyCancellable>()
......
viewModel.$text.sink { text in
print(text)
}.store(in: &cancellables)
Upvotes: 1
Reputation: 1480
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)
Upvotes: 2