![](/img/trans.png)
[英]Bind a tuple or string in view controller to view model with RXSwift
[英]RXSwift bind view model data to view controller uiimageview
我是RXSwift的新手,請幫助找到最佳解決方案。 我有實例變量的視圖模型:
var capturedImageData: Data?
我需要取消隱藏UIImageView視圖並在captureImageData接收數據之后設置圖像,例如在從相機捕獲圖像上。
您將需要觀察的價值capturedImageData
您可以創建一個behaviorRelay
的capturedImageData
就像是
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.