I have a UITableViewCell in which I have customContentView on tap of that I want to send a callback to the viewController. For this I am using RxSwift.
class GISThemeFormTableCell: UITableViewCell {
@IBOutlet weak var customContentView: UIView!
var index = -1
var cellSelected: Observable<(Int, Bool)>?
private var observer: AnyObserver<(Int, Bool)>?
override func awakeFromNib() {
super.awakeFromNib()
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.didSelectCell))
customContentView.addGestureRecognizer(tapGesture)
cellSelected = Observable<(Int, Bool)>.create { (observer) -> Disposable in
self.observer = observer
return Disposables.create()
}
}
@objc private func didSelectCell() {
let newImage = selectionImageView.image! == Images.uncheckedRound ? Images.checkedRound : Images.uncheckedRound
selectionImageView.image = newImage
observer?.onNext((index, selectionImageView.image! == Images.checkedRound))
}
}
class GISFormListView: UIView {
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
switch indexPath.section {
case 0:
let cell = tableView.dequeueReusableCell(withIdentifier: "GISThemeFormTableCell", for: indexPath) as! GISThemeFormTableCell
cell.index = indexPath.row
cell.formTitle.text = presenter.getFormName(indexPath.row)
cell.cellSelected?.subscribe { (event) in
let index = event.element!.0
let isSelected = event.element!.1
print(index, isSelected)
}.disposed(by: disposeBag)
return cell
case 1:
let cell = tableView.dequeueReusableCell(withIdentifier: "LoadingTableViewCell", for: indexPath) as! LoadingTableViewCell
return cell
default:
return UITableViewCell()
}
}
}
In above code I have created Observable in awakeFromNib method and I have initialised observer over there. Once the didSelectCell method is called I am passing the index of the cell and bool in the observer.
I just wanted to know if this is a correct to way to achive this if I don't want to use closures and delegates.