2017-07-21 51 views
1

我有自己的圖像類(UICustomImage)。如何訂閱更改圖片

如何跟蹤對圖片的更改並更新GLKView?

視圖模型:

final class ViewModel { 

private let disposeBag = DisposeBag() 

let image: UICustomImage 
let sliderValue: Variable<Float> 

init(image: UIImage) { 

    self.sliderValue = Variable(Float(0.0)) 

    self.image = UICustomImage(image: image)   

    self.sliderValue.asObservable() 
     .subscribe(onNext: { (value) in 
      self.image.brightness(n: value) 
     }) 
     .disposed(by: disposeBag) 
} 

} 

的ViewController:

@IBOutlet var slider: UISlider! 

private let disposeBag = DisposeBag() 
private var viewModel: ViewModel! 

var image: UIImage? 

override viewDidLoad() { 
    viewModel = ViewModel(image: image!) 

    slider.rx.value 
     .subscribe(onNext: { value in 
      self.viewModel.sliderValue.value = value 
     }) 
     .disposed(by: disposeBag) 
} 

我想要的圖片將滑塊移動時更新。

+0

您的代碼看起來正確。它不工作? – shpasta

+0

@shpasta此代碼有效。我不知道如何訂閱圖片更改。 – nik3212

+0

我不知道你的CustomImage類裏面有什麼,但是你可以用KVO觀察它的屬性,比如image.rx.observe(Float.self,「brightness」)。subscribe(onNext:{brightness in ...} ),以防亮度是CustomImage類的Float屬性 – shpasta

回答

2

您需要將您的明亮圖像導出爲Observable。這將是簡單得多,如果你上的UIImage了你的brightness(n:)功能的擴展,而不是做一個自定義類的......

一些注意事項:

  • 的ViewModels做需要處置袋。如果你在你的視圖模型中放置一個,你可能做錯了。
  • 我認爲UICustomImage可以通過調用asImage返回更新的UIImage
  • 我認爲brightness(n:)沒有返回值。

請注意我是如何使image因變量sliderValue

final class ViewModel { 

    let image: Observable<UIImage> 
    let sliderValue: Variable<Float> 

    init(image: UIImage) { 

     sliderValue = Variable(Float(0.0)) 

     self.image = sliderValue.asObservable() 
      .map { let image = UICustomImage(image: image) 
       image.brightness(n: $0) 
       return image.asImage 
      } 
    } 
} 

注意視圖控制器:

  • 你忘了打電話給super.viewDidLoad()。你必須一直這樣做。
  • 我製作了image隱式解開。也可能是因爲在任何情況下代碼都會在沒有圖像的情況下崩潰。
  • 我將您的訂閱轉換爲綁定。它看起來更乾淨。

將viewModel的image屬性設置爲observable後,您只需將其綁定到圖像視圖即可。

final class ViewController: UIViewController { 

    @IBOutlet weak var slider: UISlider! 
    @IBOutlet weak var imageView: UIImageView! 

    private let disposeBag = DisposeBag() 
    private var viewModel: ViewModel! 

    var image: UIImage! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     viewModel = ViewModel(image: image) 

     slider.rx.value 
      .bind(to: viewModel.sliderValue) 
      .disposed(by: disposeBag) 

     viewModel.image 
      .bind(to: imageView.rx.image) 
      .disposed(by: disposeBag) 
    } 
}