RxSwift + canMoveRowAt - PullRequest
       65

RxSwift + canMoveRowAt

0 голосов
/ 19 декабря 2018

Я использую RxSwift (RxCocoa) для заполнения ячеек tableView

viewModel.cellsDriver.drive(tableView.rx.items) { ... }

Таким образом, у меня нет доступа к методу tableView's dataSource

func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool

Но мне нужно указать, какойстроки могут быть перемещены для

tableView.rx.itemMoved

Как я могу ограничить, какие строки не должны быть в состоянии перетаскивать?Я бы предпочел не использовать RxDataSources

1 Ответ

0 голосов
/ 20 декабря 2018

Чтобы сделать это, вам нужно сделать одну из двух вещей.Либо подключите RxDataSource Cocoapod и используйте один из подклассов TableViewSectionedDataSource, либо создайте собственный источник данных.

Нетрудно создать источник данных.Вот пример: https://github.com/dtartaglia/RxMultiCounter/blob/master/RxMultiCounter/RxExtensions/RxSimpleAnimatableDataSource.swift Я использовал DifferenceKit в моем, но если вы хотите быть очень простым, вы можете просто вызвать tableView.reloadData() в вашем func tableView(_:observedEvent) методе.

Вот пример:

//
//  RxTableViewMovableRowDataSource.swift
//
//  Created by Daniel Tartaglia on 12/19/18.
//  Copyright © 2018 Daniel Tartaglia. MIT License.
//

import UIKit
import RxSwift
import RxCocoa


class RxTableViewMovableRowDataSource<E, Cell: UITableViewCell>: NSObject, RxTableViewDataSourceType, UITableViewDataSource {

    init(identifier: String, configure: @escaping (Int, E, Cell) -> Void, canMoveRowAt: ((Int, E) -> Bool)? = nil) {
        self.identifier = identifier
        self.configure = configure
        self.canMoveRowAt = canMoveRowAt
    }

    func tableView(_ tableView: UITableView, observedEvent: Event<[E]>) {
        values = observedEvent.element ?? []
        tableView.reloadData()
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return values.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: identifier, for: indexPath) as! Cell
        let row = indexPath.row
        configure(row, values[row], cell)
        return cell
    }

    func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
        let row = indexPath.row
        return canMoveRowAt?(row, values[row]) ?? true
    }

    let identifier: String
    let configure: (Int, E, Cell) -> Void
    let canMoveRowAt: ((Int, E) -> Bool)?
    var values: Element = []
}
...