UItableViewcell 内的 UIcollectionView 使用 rxSwift 失败
UIcollectionView inside UItableViewcell using rxSwift fail
所以我尝试在 tableviewCell 中实现 collectionView,但在获取数据后出现了奇怪的行为。
这是 tableViewCell:
class PortfolioPieTableViewCell: PortfolioBaseCell {
@IBOutlet weak var pageControl: UIPageControl!
@IBOutlet weak var collectionView: UICollectionView!
private var disposeBag = DisposeBag()
override class var identifier: String {
return "PortfolioPieTableViewCell"
}
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func prepareForReuse() {
super.prepareForReuse()
disposeBag = DisposeBag()
}
func config(viewModel: PortfolioPieTableViewViewModelCell) {
collectionView.register(UINib(nibName: "PortfolioPieCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "PortfolioPieCollectionViewCell")
viewModel.items.debug("PortfolioPieTableViewViewModelCell ").drive(collectionView.rx.items) { collectionView, index, element in
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "PortfolioPieCollectionViewCell", for: IndexPath(row: index, section: 0)) as! PortfolioPieCollectionViewCell
cell.configureCell(element)
return cell
}.disposed(by: disposeBag)
viewModel.fetchData()
}
}
This is the viewModel:
final class PortfolioPieTableViewViewModelCell {
//MARK:- Output
private let _items = BehaviorRelay<[[String]]>(value: [])
lazy var items = _items.asDriver(onErrorJustReturn: []).debug(" ")
private let positions: [[String]]
init(pieList: [[String]]) {
self.positions = pieList
}
func fetchData() {
var items = [[String]]()
positions.forEach { position in
items.append(position)
}
_items.accept(items)
}
}
这是版画:
021-11-08 19:53:57.830: PortfolioPieTableViewViewModelCell -> isDisposed
2021-11-08 19:53:57.830: -> isDisposed
2021-11-08 19:53:57.833:PortfolioPieTableViewViewModelCell -> 已订阅
2021-11-08 19:53:57.834:-> 已订阅
2021-11-08 19:53:57.835:-> 下一个事件([])
2021-11-08 19:53:57.835:PortfolioPieTableViewViewModelCell -> 下一个事件([])
2021-11-08 19:53:57.836:-> 下一个事件([[“800000-402”、“800000-490”、“800000-436”、“800000-427”、“800000-433”、 “800000-202”、“800000-271”、“800000-270”]])
2021-11-08 19:53:57.836:PortfolioPieTableViewViewModelCell -> 下一个事件([[“800000-402”、“800000-490”、“800000-436”、“800000-427”、“800000-433” , "800000-202", "800000-271", "800000-270"]])
如你所见,我正在获取值但我没有进入驱动方法:
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "PortfolioPieCollectionViewCell", for: IndexPath(row: index, section: 0)) as! PortfolioPieCollectionViewCell
cell.configureCell(element)
return cell
这不是 RxSwift 的问题。您传递给 collectionView.rx.items
的闭包由 OS 使用,并且只有在 OS 调用它时才会被调用。如果项目存在时没有调用闭包,那是因为 OS 不需要任何单元格来显示。
例如,如果集合视图的大小为零,就会发生这种情况。我建议你检查一下这个单元格的布局。我怀疑你会在那里发现问题。
所以我尝试在 tableviewCell 中实现 collectionView,但在获取数据后出现了奇怪的行为。
这是 tableViewCell:
class PortfolioPieTableViewCell: PortfolioBaseCell {
@IBOutlet weak var pageControl: UIPageControl!
@IBOutlet weak var collectionView: UICollectionView!
private var disposeBag = DisposeBag()
override class var identifier: String {
return "PortfolioPieTableViewCell"
}
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func prepareForReuse() {
super.prepareForReuse()
disposeBag = DisposeBag()
}
func config(viewModel: PortfolioPieTableViewViewModelCell) {
collectionView.register(UINib(nibName: "PortfolioPieCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "PortfolioPieCollectionViewCell")
viewModel.items.debug("PortfolioPieTableViewViewModelCell ").drive(collectionView.rx.items) { collectionView, index, element in
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "PortfolioPieCollectionViewCell", for: IndexPath(row: index, section: 0)) as! PortfolioPieCollectionViewCell
cell.configureCell(element)
return cell
}.disposed(by: disposeBag)
viewModel.fetchData()
}
}
This is the viewModel:
final class PortfolioPieTableViewViewModelCell {
//MARK:- Output
private let _items = BehaviorRelay<[[String]]>(value: [])
lazy var items = _items.asDriver(onErrorJustReturn: []).debug(" ")
private let positions: [[String]]
init(pieList: [[String]]) {
self.positions = pieList
}
func fetchData() {
var items = [[String]]()
positions.forEach { position in
items.append(position)
}
_items.accept(items)
}
}
这是版画:
021-11-08 19:53:57.830: PortfolioPieTableViewViewModelCell -> isDisposed 2021-11-08 19:53:57.830: -> isDisposed 2021-11-08 19:53:57.833:PortfolioPieTableViewViewModelCell -> 已订阅 2021-11-08 19:53:57.834:-> 已订阅 2021-11-08 19:53:57.835:-> 下一个事件([]) 2021-11-08 19:53:57.835:PortfolioPieTableViewViewModelCell -> 下一个事件([]) 2021-11-08 19:53:57.836:-> 下一个事件([[“800000-402”、“800000-490”、“800000-436”、“800000-427”、“800000-433”、 “800000-202”、“800000-271”、“800000-270”]]) 2021-11-08 19:53:57.836:PortfolioPieTableViewViewModelCell -> 下一个事件([[“800000-402”、“800000-490”、“800000-436”、“800000-427”、“800000-433” , "800000-202", "800000-271", "800000-270"]])
如你所见,我正在获取值但我没有进入驱动方法:
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "PortfolioPieCollectionViewCell", for: IndexPath(row: index, section: 0)) as! PortfolioPieCollectionViewCell
cell.configureCell(element)
return cell
这不是 RxSwift 的问题。您传递给 collectionView.rx.items
的闭包由 OS 使用,并且只有在 OS 调用它时才会被调用。如果项目存在时没有调用闭包,那是因为 OS 不需要任何单元格来显示。
例如,如果集合视图的大小为零,就会发生这种情况。我建议你检查一下这个单元格的布局。我怀疑你会在那里发现问题。