如何使用 RxSwift 将数据添加到 tableview 或 collectionview
How to prepend data to tableview or collectionview using RxSwift
我可以看到我可以像 Publish
或 Variable
一样使用 Subject
将新元素添加到 table 视图或集合视图,并且会正确显示在end 但如果需要在 table 视图的开头添加新数据怎么办。那怎么办呢??
如何将数据添加到可观察序列中,以便新数据显示在 table 视图或集合视图的顶部???
您可以使用 combineLatest
运算符。
最初,newData
是一个空数组,当你向它添加数据时,它显示在tableView
的顶部
let data = [
"A New Hope",
"The Empire Strikes Back",
"Return of the Jedi"
]
let obsData = Observable.just(data)
let newData = [
"The Phantom Menace",
"Attack of the Clones",
"Revenge of the Sith"
]
let obsNewData = Observable.just(newData)
let items = Observable.combineLatest(obsData, obsNewData){
+[=10=]
}
items.bindTo(tableView.rx.items(cellIdentifier: "Cell", cellType: UITableViewCell.self)) { (row, film, cell) in
cell.textLabel?.text = film
}
.addDisposableTo(disposeBag)
我正在寻找的完整外观
import UIKit
import RxSwift
import RxCocoa
struct Person {
let name : String
let age : Int
}
class ViewController: UIViewController {
let personArray = [
Person(name: "name1", age: 11),
Person(name: "name2", age: 12),
Person(name: "name3", age: 13)
]
let disposeBag = DisposeBag()
var items : Observable<[Person]>!
@IBOutlet weak var mytable: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
items = Observable.just(personArray)
bindData()
}
@IBAction func prependButtonAction(_ sender: UIButton) {
let newPersonArray = [
Person(name: "name -3", age: 11),
Person(name: "name -4", age: 12)
]
prependData(dataToPrepend: newPersonArray)
}
@IBAction func appendButtonAction(_ sender: UIButton) {
let newPersonArray = [
Person(name: "name 6", age: 11),
Person(name: "name 7", age: 12)
]
appendData(dataToAppend : newPersonArray)
}
private func bindData() {
mytable.dataSource = nil
items.bindTo(mytable.rx.items(cellIdentifier: "cell")) { (row, person, cell) in
if let cellToUse = cell as? TableViewCell {
cellToUse.label1.text = person.name
cellToUse.label2.text = "\(person.age)"
}
}.addDisposableTo(disposeBag)
}
private func prependData(dataToPrepend : [Person]) {
let newObserver = Observable.just(dataToPrepend)
items = Observable.combineLatest(items, newObserver) {
+[=10=]
}
bindData()
}
private func appendData(dataToAppend : [Person]) {
let newObserver = Observable.just(dataToAppend)
items = Observable.combineLatest(items, newObserver) {
[=10=]+
}
bindData()
}
}
我可以看到我可以像 Publish
或 Variable
一样使用 Subject
将新元素添加到 table 视图或集合视图,并且会正确显示在end 但如果需要在 table 视图的开头添加新数据怎么办。那怎么办呢??
如何将数据添加到可观察序列中,以便新数据显示在 table 视图或集合视图的顶部???
您可以使用 combineLatest
运算符。
最初,newData
是一个空数组,当你向它添加数据时,它显示在tableView
let data = [
"A New Hope",
"The Empire Strikes Back",
"Return of the Jedi"
]
let obsData = Observable.just(data)
let newData = [
"The Phantom Menace",
"Attack of the Clones",
"Revenge of the Sith"
]
let obsNewData = Observable.just(newData)
let items = Observable.combineLatest(obsData, obsNewData){
+[=10=]
}
items.bindTo(tableView.rx.items(cellIdentifier: "Cell", cellType: UITableViewCell.self)) { (row, film, cell) in
cell.textLabel?.text = film
}
.addDisposableTo(disposeBag)
我正在寻找的完整外观
import UIKit
import RxSwift
import RxCocoa
struct Person {
let name : String
let age : Int
}
class ViewController: UIViewController {
let personArray = [
Person(name: "name1", age: 11),
Person(name: "name2", age: 12),
Person(name: "name3", age: 13)
]
let disposeBag = DisposeBag()
var items : Observable<[Person]>!
@IBOutlet weak var mytable: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
items = Observable.just(personArray)
bindData()
}
@IBAction func prependButtonAction(_ sender: UIButton) {
let newPersonArray = [
Person(name: "name -3", age: 11),
Person(name: "name -4", age: 12)
]
prependData(dataToPrepend: newPersonArray)
}
@IBAction func appendButtonAction(_ sender: UIButton) {
let newPersonArray = [
Person(name: "name 6", age: 11),
Person(name: "name 7", age: 12)
]
appendData(dataToAppend : newPersonArray)
}
private func bindData() {
mytable.dataSource = nil
items.bindTo(mytable.rx.items(cellIdentifier: "cell")) { (row, person, cell) in
if let cellToUse = cell as? TableViewCell {
cellToUse.label1.text = person.name
cellToUse.label2.text = "\(person.age)"
}
}.addDisposableTo(disposeBag)
}
private func prependData(dataToPrepend : [Person]) {
let newObserver = Observable.just(dataToPrepend)
items = Observable.combineLatest(items, newObserver) {
+[=10=]
}
bindData()
}
private func appendData(dataToAppend : [Person]) {
let newObserver = Observable.just(dataToAppend)
items = Observable.combineLatest(items, newObserver) {
[=10=]+
}
bindData()
}
}