用于OSX的RXSwift和RxCocoa的NSTableview

时间:2018-01-03 06:18:27

标签: macos reactive-programming nstableview rx-swift rx-cocoa

如何使用反应框架使用数组填充 NSTableview ? 在iOS for UITableview中:

self.viewModel.arrayElements.asObservable()
        .observeOn(MainScheduler.instance)
        .bind(to: detailsTableView.rx.items(cellIdentifier: "comment", cellType: UITableViewCell.self)){
            (row,element,cell) in
                 cell.addSubview(cellView)
        }.addDisposableTo(disposeBag)

如何为 NSTableView

实现相同目标

enter image description here

2 个答案:

答案 0 :(得分:0)

我遇到了类似的需求,并用BehaviorRelay(使用RxSwift 5)解决了这个问题。

BehaviorRelay充当中介者,因此可以使用常规的NSTableViewDataSourceNSTableViewDelegate协议

重要的部分是self.detailsTableView.reloadData()语句,该语句告诉tableview重新加载数据,它不会自动触发。

类似这样的东西:

var disposeBag = DisposeBag()
var tableDataRelay = BehaviorRelay(value: [Element]())

func viewDidLoad() {
    viewModel.arrayElements.asObservable()
        .observeOn(MainScheduler.instance)
        .bind(to: tableDataRelay).disposed(by: disposeBag)

    tableDataRelay
        .observeOn(MainScheduler.instance)
        .subscribe({ [weak self] evt in
            self.detailsTableView.reloadData()
        }).disposed(by: disposeBag)
}

func numberOfRows(in tableView: NSTableView) -> Int {
    return tableDataRelay.value.count
}

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
    let element = tableDataRelay.value[row]
    let cellView = tableView.makeView(withIdentifier: tableColumn!.identifier, owner: nil) as? NSTableCellView

    cellView?.textField?.stringValue = element.comment
    return cellView
}


答案 1 :(得分:-1)

尝试下面的内容,你应该使用不可观察的驱动程序

阅读此https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Traits.md

import RxSwift
import RxCocoa

let data = Variable<[String]>([])
let bag  = DisposeBag()

override func viewDidLoad() {
super.viewDidLoad()

    data.asDriver.drive( tableView.rx.items(cellIdentifier: "idenifier")){(row:Int, comment:String, cell:UITableViewCell) in
        cell.title = report
    }.disposed(by:bag)
}