当显示tableView时如何将tableView单元排列为不同的顺序?

问题描述 投票:0回答:1

我已经使用tableView设置了Rx,并允许用户使用cells上下移动rx.itemMoved

let testData = BehaviorRelay<[String]>(value: ["hello", "hello again", "hello a third time"])

tableView.isEditing = true

testData.bind(to: tableView.rx.items(cellIdentifier:"cell")) { row, data, cell in
    cell.textLabel?.text = data
}.disposed(by: disposeBag)

tableView.rx.itemMoved
    .subscribe(onNext: { indexPaths in
        //...
    }).disposed(by:disposeBag)

[可以,以后我将indexPaths保存到coreData,并使用该数据按照用户排列它们的顺序来设置tableView cells。但这是以后的问题。首先,我想测试用一些假的cells重新排列data,以查看是否可以在cellrow时立即更改tableView populated的顺序。想象一下,这个假人data来自coreData

我不知道该怎么做,但是我在这里找到了一些东西:https://github.com/ReactiveX/RxSwift/blob/master/Tests/RxCocoaTests/UITableView%2BRxTests.swift我至少认为看起来像我所需要的。我在下面尝试过,但是它什么也没做:

let testRow = IndexPath(row: 0, section: 0)
let testRow2 = IndexPath(row: 2, section: 0)

tableView.dataSource!.tableView!(tableView, moveRowAt: testRow, to: testRow2)

我也尝试过

self.tableView.moveRow(at: testRow, to: testRow2)

逻辑似乎是我想要做的,但是什么也没有...所以我该怎么做?

ios swift uitableview rx-swift
1个回答
0
投票

为了重新排序项目,您必须在源处更改顺序并重新发射数组。这意味着您必须在中继上accept一个新阵列。像这样的东西:

final class ExampleViewController: UITableViewController {

    let disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()

        let testData = BehaviorRelay<[String]>(value: ["hello", "hello again", "hello a third time"])

        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
        tableView.isEditing = true
        tableView.dataSource = nil
        testData.bind(to: tableView.rx.items(cellIdentifier:"cell")) { row, data, cell in
            cell.textLabel?.text = data
        }
        .disposed(by: disposeBag)

        tableView.rx.itemMoved
            .subscribe(onNext: { indexPaths in
                var items = testData.value
                let item = items.remove(at: indexPaths.sourceIndex.row)
                items.insert(item, at: indexPaths.destinationIndex.row)
                testData.accept(items)
            })
            .disposed(by:disposeBag)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.