我想将我的ImageView绑定到viewModel,以便将所选图像保存到核心数据。
我的代码如下:

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

我得到错误:
活页夹的值?>没有成员“bind”
如何通过良好的MVVM实践将图像保存到核心数据?
更新
我在视图控制器中选择照片:
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)

最佳答案

UIImageView是不可绑定的,因为它是一个输出视图,而不是一个输入视图,也就是说,你把东西推到它里面,它不会把东西推出来。
要将图像发射到视图模型,需要在将图像推入UIImageView的位置执行此操作。

09-27 14:22