1

not very expert with RxSwift, I tested some solution found here, such this but not working. Don't know if issue is about size of an empty tableview or som other UI update related issue.

the tableView I am using is a bit customized such this

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()
    }
}

the solution I am testing

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)
biggreentree
  • 1,633
  • 3
  • 20
  • 35

2 Answers2

0

I think you can use a pod called pod 'EmptyDataSet-Swift' It will help you do this regarding any empty tableView

Menaim
  • 937
  • 7
  • 28
0

Try this Update UIElements inside DispatchQueue.main.async {...}

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)
Ramprasath Selvam
  • 3,868
  • 3
  • 25
  • 41
  • not working, don' know if this is important, but this code is called in viewDidLoad, but even testing in willAppear is not working – biggreentree Jun 04 '21 at 15:09
  • updated question with more info about table view, this is all I have got – biggreentree Jun 04 '21 at 15:13
  • adding a constraint via code for the height of tableview seems to work, do you know how to calculate properly the value to pass? giving the superview'heght is not working – biggreentree Jun 04 '21 at 15:57