Forward ControlEvent from UITableView



我想在一个单独的控制器(我的PlanetPickerViewController(中创建一个行星列表。此控制器使用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> 替换这个委托。这就是我对public var selection: ControlEvent<Planet>!的意图.不好的是我无法在viewDidLoad发生之前订阅它......

我应该更改什么才能在实例化此控制器后立即订阅我的selection

let modal = PlanetPickerViewController(list: planets, active: nil)
modal.selection.subscribe { do something }
self.present(modal, animated: true, completion: nil)

您可以创建一个Observable<Planet>并在主视图控制器中订阅它:

// 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)

最新更新