NSTableview с RXSwift и RxCocoa для OSX

Как заполнить NSTableview массивом с помощью реактивной среды? В iOS для 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

введите описание изображения здесь


person Padma    schedule 03.01.2018    source источник


Ответы (2)


Я столкнулся с аналогичной проблемой и решил ее с помощью BehaviorRelay (используя RxSwift 5).

BehaviorRelay действует как посредник, поэтому можно использовать обычные NSTableViewDataSource и NSTableViewDelegate протоколы.

Важной частью является оператор 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
}


person Jimmy Stenke    schedule 01.06.2020

Попробуйте следующее, вы должны использовать драйверы, которые не наблюдаются

прочтите этот 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)
}
person Mark Gilchrist    schedule 19.01.2018
comment
Пожалуйста, обратитесь к моему измененному сообщению. Я имел в виду NSTableview из набора приложений. - person Padma; 07.02.2018
comment
@Padma извини, что не могу тебе с этим помочь - person Mark Gilchrist; 08.02.2018