【发布时间】:2019-09-13 04:14:00
【问题描述】:
我有一个 UITableViewCell,其中有 customContentView,我想向 viewController 发送回调。为此,我正在使用 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()
}
}
}
在上面的代码中,我在 awakeFromNib 方法中创建了 Observable,并在那里初始化了观察者。调用 didSelectCell 方法后,我将在观察者中传递单元格和 bool 的索引。
如果我不想使用闭包和委托,我只是想知道这是否是实现此目标的正确方法。
【问题讨论】: