Как привязать изображение к UIImageView с помощью rxswift? - PullRequest
0 голосов
/ 26 января 2019

У меня есть viewModel:

class EditFoodViewViewModel {
    private var food: Food

    var foodImage = Variable<NSData>(NSData())

    init(food: Food) {
        self.food = food
        self.foodImage.value = food.image!
    }
}

И ViewController:

class EditFoodViewController: UIViewController {
    public var food: EditFoodViewViewModelType?
    @IBOutlet weak var foodThumbnailImageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()

        guard let foodViewModel = food else { return }
        foodViewModel.foodImage.asObservable().bind(to: foodThumbnailImageView.rx.image).disposed(by: disposeBag)
  }
}

В последней строке viewController (где мой UIImageView) ошибка get:

Общий параметр «Self» не может быть выведен

Как решить мою проблему? Как установить изображение для imageView с rxSwift?

1 Ответ

0 голосов
/ 26 января 2019

Почти всегда, когда вы видите ошибку: «Общий параметр« Self »не может быть выведен», это означает, что типы ошибочны.В этом случае вы пытаетесь связать Observable<NSData> с Observable<Image?>.

Также есть несколько других проблем с вашим кодом.

  • очень редко тип субъекта следует определять с помощью ключевого слова var, и это не один из тех редких случаев.Ваш foodImage должен быть let, а не var.

  • Variable устарел;не используйте это.В этом случае вам даже не нужен объект.

  • NSData также неуместен в современном Swift.Вместо этого используйте Data.

Исходя из того, что вы здесь показали, я ожидаю, что ваш код будет выглядеть примерно так:

class EditFoodViewViewModel: EditFoodViewViewModelType {
    let foodImage: Observable<UIImage?>

    init(food: Food) {
        self.foodImage = Observable.just(UIImage(data: food.image))
    }
}

class EditFoodViewController: UIViewController {

    @IBOutlet weak var foodThumbnailImageView: UIImageView!
    public var food: EditFoodViewViewModelType?
    private let disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()

        guard let foodViewModel = food else { return }
        foodViewModel.foodImage
            .bind(to: foodThumbnailImageView.rx.image)
            .disposed(by: disposeBag)
    }
}
...