类型'Binder的价值 '没有会员'绑定'

问题描述 投票:0回答:1

我想将我的ImageView绑定到viewModel,以便将我选择的图像保存到Core Data。

我的代码看起来像这样:

class FoodViewModel: FoodViewModelType {
    var foodImage: BehaviorRelay<UIImage?>
    //... another code
}

我的控制器:

class NewFoodViewController: UIViewController {
    @IBOutlet weak var foodImageView: UIImageView!

    override func viewDidLoad() {
       //... another code
       self.foodImageView.rx.image.bind(to: foodViewModel.foodImage).disposed(by: self.disposeBag)
    }
}

我得到错误:

类型Binder的价值<UIImage? >没有会员'绑定'

如何通过良好的MVVM实践将我的图像保存到Core Data?

更新

我在视图控制器中选择照片:

func chooseImagePickerAction(source: UIImagePickerController.SourceType) {
    if UIImagePickerController.isSourceTypeAvailable(source) {
        let imagePicker = UIImagePickerController()
        imagePicker.sourceType = source
        imagePicker.delegate = self
        self.present(imagePicker, animated: true, completion: nil)
    }
}

@objc func foodImageViewTapped(_ sender: AnyObject) {
    let alertController = UIAlertController(title: "Photo path", message: nil, preferredStyle: .actionSheet)

    let cameraAction = UIAlertAction(title: "Camera", style: .default) { (action) in
        self.chooseImagePickerAction(source: .camera)
    }

    let photoLibAction = UIAlertAction(title: "Photo", style: .default) { (action) in
        self.chooseImagePickerAction(source: .photoLibrary)
    }

    let cancelAction = UIAlertAction(title: "Cancel", style: .default)

    alertController.addAction(cameraAction)
    alertController.addAction(photoLibAction)
    alertController.addAction(cancelAction)

    self.present(alertController, animated: true, completion: nil)
}

extension NewFoodViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

        let info = convertFromUIImagePickerControllerInfoKeyDictionary(info)

        foodImageView.image = info[convertFromUIImagePickerControllerInfoKey(UIImagePickerController.InfoKey.originalImage)] as? UIImage
        foodImageView.contentMode = .scaleAspectFill

        dismiss(animated: true, completion: nil)
    }

    private func convertFromUIImagePickerControllerInfoKeyDictionary(_ input: [UIImagePickerController.InfoKey: Any]) -> [String: Any] {
        return Dictionary(uniqueKeysWithValues: input.map {key, value in (key.rawValue, value)})
    }

    private func convertFromUIImagePickerControllerInfoKey(_ input: UIImagePickerController.InfoKey) -> String {
        return input.rawValue
    }
}

并在viewDidLoad(没有图像):

saveNewFoodBarButtonItem.rx.tap.subscribe(onNext: { [weak self] _ in
    guard let self = self else { return }

    let foodViewModel = FoodViewModel()

    self.foodQuantityTypeTextField.rx.text.bind(to: foodViewModel.foodQuantityType).disposed(by: self.disposeBag)
    self.foodShelfLifeTextField.rx.text.bind(to: foodViewModel.foodShelfLife).disposed(by: self.disposeBag)
    self.foodCategoryTextField.rx.text.bind(to: foodViewModel.foodCategoryId).disposed(by: self.disposeBag)
    self.foodQuantityTextField.rx.text.bind(to: foodViewModel.foodQuantity).disposed(by: self.disposeBag)
    self.foodNameTextField.rx.text.bind(to: foodViewModel.foodName).disposed(by: self.disposeBag)

    foodViewModel.saveNewFood(fridgeViewModel: self.fridgeViewModel!)

    self.dismiss(animated: true)
}).disposed(by: disposeBag)
ios swift core-data data-binding rx-swift
1个回答
1
投票

UIImageView是不可绑定的,因为它是一个输出视图,而不是输入视图,即你把东西推进去,它不会把事情搞砸。

为了将图像发射到视图模型,您需要在将图像推入UIImageView的位置执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.