【问题标题】:How can I catch that @Published has changed with combine ? (UIKit)我怎样才能发现 @Published 已经用 combine 改变了? (UIKit)
【发布时间】:2021-08-18 18:51:47
【问题描述】:

它在 CarDetailViewModel 中的 @Published 变量中获取数据,但我无法将此变量中的数据传递给 ViewController 中的变量。

视图模型:

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)
    }
}

视图控制器:

assignmentDataToUI函数运行时,屏幕上的labelblank

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

【问题讨论】:

  • 不清楚问题是什么。您订阅的是 carSubject,而不是 carDetail。
  • 当 CarDetailViewModel 中的 @Published 变量发生变化时,我想将此变化传递给 CarDetailViewController。
  • 但你没有这样做。
  • 我的代码正在运行,先生。你可以检查吗 ?我写了答案
  • 如果它工作,有什么问题?

标签: swift uikit combine


【解决方案1】:

我在 ViewModel 中使用 sink 聆听 carDetail。

 carDetailViewModel.$carDetail
                .sink {[weak self] car in
                    guard let self = self else { return }
                    self.assignmentDataToUI()
                }
                .store(in: &anyCancelable)

【讨论】:

    猜你喜欢
    • 2018-07-30
    • 2023-01-22
    • 2022-10-01
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 2019-01-30
    相关资源
    最近更新 更多