Значение типа 'Binder <UIImage?>' Не имеет члена 'bind' - PullRequest
0 голосов
/ 12 марта 2019

Я хочу привязать свой 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 не имеет члена 'bind'

Как сохранить мой образ в Core Data с хорошей практикой 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)

1 Ответ

1 голос
/ 12 марта 2019

UIImageView не является привязываемым, потому что это выходное представление, а не входное представление, т. Е. Вы помещаете в него что-то, а оно не выталкивает.

Чтобы передать изображение в модель вашего вида, вам нужно сделать это в точке, где вы помещаете изображение в UIImageView.

...