Skip to content

Instantly share code, notes, and snippets.

@mmcbrear
Last active March 6, 2017 11:30
Show Gist options
  • Save mmcbrear/4ffaeec1ea87c090c3e8c10e18bdba41 to your computer and use it in GitHub Desktop.
Save mmcbrear/4ffaeec1ea87c090c3e8c10e18bdba41 to your computer and use it in GitHub Desktop.
//
// UIViewController+Rx.swift
//
// Created by Martin McBrearty on 29/04/2016.
//
import Foundation
import RxSwift
extension UIViewController {
func bind<T>(_ element: UIResponder, observable: Observable<T?>?, disposeBag: DisposeBag?) {
guard let disposeBag = disposeBag else { return }
observable?.subscribe(onNext: { value in
self.ASyncMain {
if type(of: element) === UILabel.self {
if let value = value as? NSAttributedString {
(element as? UILabel)?.attributedText = value
} else if let value = value as? String {
(element as? UILabel)?.text = value
} else if let value = value as? UIColor {
(element as? UILabel)?.textColor = value
}
} else if type(of: element) === UIImageView.self {
if let value = value as? UIImage {
(element as? UIImageView)?.image = value
}
}
}
}).addDisposableTo(disposeBag)
}
func bindIsHidden(_ element: UIView, observable: Observable<Bool>?, disposeBag: DisposeBag?) {
guard let disposeBag = disposeBag else { return }
observable?.subscribe(onNext: { value in
self.ASyncMain {
element.isHidden = value
}
}).addDisposableTo(disposeBag)
}
func bindButtonTitle(_ element: UIButton, observable: Observable<String>?, disposeBag: DisposeBag?) {
guard let disposeBag = disposeBag else { return }
observable?.subscribe(onNext: { value in
self.ASyncMain {
element.setTitle(value, for: .normal)
}
}).addDisposableTo(disposeBag)
}
func bindButtonTitle(_ element: UIButton, observable: Observable<NSAttributedString?>?, disposeBag: DisposeBag?) {
guard let disposeBag = disposeBag else { return }
observable?.subscribe(onNext: { value in
self.ASyncMain {
element.setAttributedTitle(value, for: .normal)
}
}).addDisposableTo(disposeBag)
}
func bindButtonImage(_ element: UIButton, observable: Observable<String?>?, disposeBag: DisposeBag?) {
guard let disposeBag = disposeBag else { return }
observable?.subscribe(onNext: { value in
self.ASyncMain {
if let value = value {
if !value.isEmpty {
element.setImage(UIImage(named: value), for: UIControlState())
}
}
}
}).addDisposableTo(disposeBag)
}
func bindButtonSelected(_ element: UIButton, observable: Observable<Bool>?, disposeBag: DisposeBag?) {
guard let disposeBag = disposeBag else { return }
observable?.subscribe(onNext: { value in
self.ASyncMain {
element.isSelected = value
}
}).addDisposableTo(disposeBag)
}
func bindProductImage(_ element: UIImageView, observable: Observable<NSNumber?>?, disposeBag: DisposeBag?) {
guard let disposeBag = disposeBag else { return }
observable?.subscribe(onNext: { value in
self.ASyncMain {
if let value = value {
self.loadImage(element, productId: value)
} else {
element.image = nil
}
}
}).addDisposableTo(disposeBag)
}
func bind(constraint: NSLayoutConstraint, observable: Observable<CGFloat>?, disposeBag: DisposeBag?) {
guard let disposeBag = disposeBag else { return }
observable?.subscribe(onNext: { value in
self.ASyncMain {
constraint.constant = value
}
}).addDisposableTo(disposeBag)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment