【问题标题】:Value of type 'Binder<UIImage?>' has no member 'bind''Binder<UIImage?>' 类型的值没有成员 'bind'
【发布时间】:2019-03-12 06:31:46
【问题描述】:

我想将我的 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 没有成员“绑定”

如何通过良好的 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)

【问题讨论】:

  • 您不应该在 viewModel 中下载图像并使用 foodImage.bind(to: foodImageView.rx.image).disposed(by: self.disposeBag) 将其绑定到视图控制器中的 imageView
  • 我想从选定的用户图像(来自 iPhone 照片库)中创建新食物。
  • 向我们展示将图像插入 UIImageView 的代码(如果您想这样做)。
  • 我正在更新我的问题。添加代码

标签: ios swift core-data data-binding rx-swift


【解决方案1】:

UIImageView 是不可绑定的,因为它是一个输出视图,而不是一个输入视图,也就是说,你将东西推入其中,它不会将东西推出。

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

【讨论】:

    猜你喜欢
    • 2016-03-11
    • 2021-06-17
    • 2016-09-11
    • 1970-01-01
    • 2018-07-12
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多