我已经使用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
,以查看是否可以在cell
为row
时立即更改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)
逻辑似乎是我想要做的,但是什么也没有...所以我该怎么做?
为了重新排序项目,您必须在源处更改顺序并重新发射数组。这意味着您必须在中继上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)
}
}