如何使用 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 ...

中的 UIElements
self.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 重新加载结束

RxSwift TableView - 如何设置 numberOfRowsInSection?

正确使用 RxSwift 和 TableView

如何在 RxSwift 中将多个数据模型绑定到 TableView

RxSwift Observeable 不会在数据更改时更新 tableview

如何在 UITableView 的 RXswift 和 RXCocoa 中实现 tableview 单元格的内部?