我想在单独的 Controller 中创建行星列表(我的 PlanetPickerViewController
)。该 Controller 使用 UITableView
显示给定列表 Planet
。这工作得很好。
public class PlanetPickerViewController: RxViewController {
// MARK: - PUBLIC -
public var selection: ControlEvent<Planet>!
public init(list: Driver<[Planet]>, active: Planet?) {
self.list = list
self.active = active
super.init(nibName: "PlanetPickerViewController", bundle: nil)
}
@available(*, unavailable)
required public init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") }
// MARK: - PRIVATE -
private let list: Driver<[Planet]>
private let active: Planet?
// MARK: IBOutlets
@IBOutlet private weak var tableView: UITableView!
// MARK: View life cycle
override public func viewDidLoad() {
super.viewDidLoad()
self.initializeTableView()
}
private func initializeTableView() {
self.list.drive(self.tableView.rx.items(reusable: PlanetTableViewCell.self)) { row, planet, cell in
cell.display(planet)
cell.isSelected = planet == self.active
}
.disposed(by: self)
self.selection = self.tableView.rx.modelSelected(Planet.self)
}
}
现在我想转发用户点击单元格的事件。通常,我会创建一个 PlanetPickerViewControllerDelegate
有专门的功能来手动转发此事件:
// PlanetPickerViewControllerDelegate
picker(_ picker: PlanetPickerViewController, didSelect planet: Planet)
// PlanetPickerViewController: UITableViewDelegate
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let planet = self.list[indexPath.row]
self.delegate?.picker(self, didSelect: planet)
}
但是对于 RxSwift,我想用 ControlEvent<Planet>
替换这个委托(delegate)。这就是我想要的 public var selection: ControlEvent<Planet>!
。不好的是我之前无法订阅viewDidLoad
发生...
我应该更改什么才能订阅我的 selection
一旦这个 Controller 被实例化?
let modal = PlanetPickerViewController(list: planets, active: nil)
modal.selection.subscribe { do something }
self.present(modal, animated: true, completion: nil)
最佳答案
您可以创建 Observable<Planet>
并在主视图 Controller 中订阅它:
// PlanetPickerViewController
let didSelectPlanet: Observable<Planet>!
private func initializeTableView() {
// ...
self.didSelectPlanet = self.tableView.rx.modelSelected(Planet.self).asObservable()
}
// MainViewController
let modal = PlanetPickerViewController(list: planets, active: nil)
modal.self.didSelectPlanet
.subscribe(onNext: { _ in /* do something */ })
.disposed(by: disposeBag)
关于ios - 从 UITableView 转发 ControlEvent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43138125/