簡體   English   中英

RXSwift將視圖模型數據綁定到視圖控制器uiimageview

[英]RXSwift bind view model data to view controller uiimageview

我是RXSwift的新手,請幫助找到最佳解決方案。 我有實例變量的視圖模型:

var capturedImageData: Data?

我需要取消隱藏UIImageView視圖並在captureImageData接收數據之后設置圖像,例如在從相機捕獲圖像上。

您將需要觀察的價值capturedImageData

您可以創建一個behaviorRelaycapturedImageData

就像是

var capturedImageData:<Data?> = BehaviorRelay.init(value: nil)

當您獲取數據時,您可以添加執行以下操作

capturedImageData.accept(data)

而在你的viewController,您訂閱capturedImageData

 self.capturedImageData.asObservable().subscribe(onNext: { (data) in
        self.imageView.image = UIImage.init(data: data)
        self.imageView.isHidden = false
  }).disposed(by: bag)

這種東西。

還沒有測試代碼,但是您可以遵循這種方法。 希望這可以幫助

從您的代碼中,我模擬了一個非常簡單的示例。

ViewModel層,您可以嘗試保留Input / Output結構以使其易於重用和使用。 這里的輸入將是您的Data無論它來自何處,輸出的是UIImage? 簡而言之,ViewModel進行邏輯轉換數據,僅在可用時加載View。

struct ViewModel {

    // input
    let loadingImageData: PublishRelay<Data>

    // output
    let showImage: Driver<UIImage?>

    init() {
        let dataRelay = PublishRelay<Data>()

        self.loadingImageData = dataRelay
        self.showImage = dataRelay.map({ UIImage(data: $0) }).asDriver(onErrorJustReturn: nil)
    }

    func loadimage() {
        // your code here to load Data ...
        loadingImageData.accept(imageData)
    }
}

class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!

    let viewModel = ViewModel()
    let disposeBag = DisposeBag()

    override func viewDidLoad() {

        // bind output viewmodel to UIImageView 
        viewModel.showImage
            .drive(imageView.rx.image)
            .disposed(by: disposeBag)
    }
}

您可以擴展邏輯以隱藏/顯示元素,方法與創建Bool事件的方法相同。

struct ViewModel {
    // ...
    let isImageHidden: Driver<Bool>

    init() {
        let dataRelay = PublishRelay<Data>()

        self.loadingImageData = dataRelay
        self.showImage = dataRelay.map({ UIImage(data: $0) }).asDriver(onErrorJustReturn: nil)
        self.isImageHidden = showImage.map({ $0 == nil })
    }
}

class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!
    let viewModel = ViewModel()
    let disposeBag = DisposeBag()

    override func viewDidLoad() {
        // ...

        viewModel.isImageHidden
            .drive(imageView.rx.isHidden)
            .disposed(by: disposeBag)
    }
}

請注意,我使用Driver來確保它在主線程上運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM