如何使用 RxSwift 为空 tableView 显示 backgroundVIew
Posted
技术标签:
【中文标题】如何使用 RxSwift 为空 tableView 显示 backgroundVIew【英文标题】:How to show a backgroundVIew for empty tableView using RxSwift 【发布时间】:2021-06-04 14:50:08 【问题描述】:对 RxSwift 不是很熟悉,我测试了一些在这里找到的解决方案,例如 this,但无法正常工作。不知道问题是关于空表视图的大小还是其他与 UI 更新相关的问题。
我使用的 tableView 有点像这样定制
public class SelfSizedTableView: UITableView
public override var intrinsicContentSize: CGSize
self.layoutIfNeeded()
return self.contentSize
public override var contentSize: CGSize
didSet
self.invalidateIntrinsicContentSize()
public override func reloadData()
super.reloadData()
self.invalidateIntrinsicContentSize()
我正在测试的解决方案
extension UITableView
func setEmptyMessage(_ message: String)
let messageLabel = UILabel(frame: CGRect(x: 0, y: 0, width: self.bounds.size.width, height: self.bounds.size.height))
messageLabel.text = message
messageLabel.textColor = .black
messageLabel.numberOfLines = 0
messageLabel.textAlignment = .center
messageLabel.font = UIFont(name: "TrebuchetMS", size: 15)
messageLabel.sizeToFit()
self.backgroundView = messageLabel
self.separatorStyle = .none
func restore()
self.backgroundView = nil
self.separatorStyle = .singleLine
self.viewModel.things.subscribe(onNext: [unowned self] things in
if things.isEmpty
self.myTableView.backgroundColor = .purple
self.myTableView.contentSize = CGSize(width: self.view.frame.width, height: self.view.frame.height)
self.myTableView.frame = CGRect(x: CGFloat(0), y: CGFloat(0), width: CGFloat(200), height: CGFloat(200))
self.myTableView.setNeedsLayout()
self.myTableView.layoutIfNeeded()
self.myTableView.setEmptyMessage("My Message")
else
self.myTableView.restore()
).disposed(by: self.rx.disposeBag)
【问题讨论】:
哪种方式?应该是 DispatchQueue.main.async ... 中的 if 代码还是整个 if 语句? 【参考方案1】:我认为你可以使用一个名为 pod 'EmptyDataSet-Swift'
的 pod,它可以帮助你处理任何空的 tableView
【讨论】:
是生产项目,不能使用未经授权的 pod,抱歉。【参考方案2】:试试这个 更新 DispatchQueue.main.async ...
中的 UIElementsself.viewModel.things.subscribe(onNext: [unowned self] things in
if things.isEmpty
DispatchQueue.main.async
self.myTableView.backgroundColor = .purple
self.myTableView.contentSize = CGSize(width: self.view.frame.width, height: self.view.frame.height)
self.myTableView.frame = CGRect(x: CGFloat(0), y: CGFloat(0), width: CGFloat(200), height: CGFloat(200))
self.myTableView.setNeedsLayout()
self.myTableView.layoutIfNeeded()
self.myTableView.setEmptyMessage("My Message")
else
DispatchQueue.main.async
self.myTableView.restore()
).disposed(by: self.rx.disposeBag)
【讨论】:
不工作,不知道这是否重要,但是在viewDidLoad中调用了这段代码,但即使在willAppear中测试也不工作 更新了关于表格视图的更多信息的问题,这就是我所拥有的 通过代码为tableview的高度添加约束似乎有效,您知道如何正确计算要传递的值吗?给superview'heght不起作用以上是关于如何使用 RxSwift 为空 tableView 显示 backgroundVIew的主要内容,如果未能解决你的问题,请参考以下文章
RxSwift TableView - 如何设置 numberOfRowsInSection?
如何在 RxSwift 中将多个数据模型绑定到 TableView