ios - 从 UITableView 转发 ControlEvent

标签 ios swift uitableview rx-swift

我想在单独的 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/

相关文章:

ios - 我不明白 zoomToRect 在 Swift 中是如何工作的

ios - 来自多对多关系的核心数据详细信息 View

ios - 在两个不同的单元格 iOS 上创建标题

iOS 添加 CAShapeLayer 未在运行时显示

swift - if 可选参数的 swift 函数中的条件

ios - 在 tableview 上实现搜索栏

iphone - 区分 didSelectRowAtIndexPath 和accessoryButtonTappedForRowWithIndexPath

iphone - 使用 UITableView 显示矩阵类型的数据

ios - UIAlertController 不弹出

ios - 加载所有 TabBar View