Juanpe / SkeletonView

☠️ An elegant way to show users that something is happening and also prepare them to which contents they are awaiting
MIT License
12.51k stars 1.1k forks source link

SkeletonTableViewDataSource numberOfRowsInSection never called #269

Open Erumaru opened 4 years ago

Erumaru commented 4 years ago

⚠️ Please fill out this template when filing an issue.

🙏🏼 Please check if it already exists other issue related with yours.

What did you do?

Created UITableView with isSkeletonable set to true. All cells and its subview also isSkeletonable set to true. Implemented SkeletonTableViewDataSource and numberOfRowsInSection in MyViewController class. Set UITableView's dataSource to MyViewController. Called showSkeleton().

What did you expect to happen?

I expected UITableView to use

func collectionSkeletonView(_ skeletonView: UITableView, numberOfRowsInSection section: Int) -> Int

What happened instead?

It always uses

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int

Steps to reproduce the behavior

Steps mentioned in what did you do

SkeletonView Environment

SkeletonView version: 1.8.6 Xcode version: 11.3.1 Swift version: 5.0

paulanatoleclaudot-betclic commented 4 years ago

showSkeleton should be called on your collection/tableView instead of your view :)

aipinn commented 4 years ago

Me too.

Erumaru commented 4 years ago

@paulanatoleclaudot-betclic thanks for your response, but I call it on collection view.

tadeha commented 4 years ago

Me too. It doesn't calculate how many cells need to populate the whole table view.

aipinn commented 4 years ago

Boys, I resolved it. I used vc addsubview tableView.

First, you must set vc self.view.isSkeletonable = true Second, for tableView must use estimatedRowHeight.

tableView.estimatedRowHeight = 130
tableView.rowHeight = UITableView.automaticDimension
mg-partec commented 4 years ago

Same problem here with 1.8.6 and 1.8.7. Fixed by reverting to version 1.8.5. I am on Xcode 11.3.1 and Swift 5.1

mkval commented 4 years ago

Got the same issue. But instead of composing my own custom TableViewController (UIViewController + UITableView), I instead opted to subclassing UITableViewController. So somehow, you need to explicitly set this controller as the dataSource of the tableView to make SV work.

class CustomTableViewController: UITableViewController {

  override func viewDidLoad() {
    super.viewDidLoad()
    ...
    tableView.dataSource = self
  }
  ...
}

extension CustomTableViewController: SkeletonTableViewDataSource {
  ...
}

Without this, when you set a breakpoint at line 35 of the file UITableView+CollectionSkeleton, guard always fails because it detects that your dataSource is of type _UIFilteredDataSource and not SkeletonTableViewDataSource.

Here's my spec: SkeletonView: 1.8.7 | Swift: 5 | Xcode: 11.2.1

XiaoxiaYao commented 2 years ago

Boys, I resolved it. I used vc addsubview tableView.

First, you must set vc self.view.isSkeletonable = true Second, for tableView must use estimatedRowHeight.

tableView.estimatedRowHeight = 130
tableView.rowHeight = UITableView.automaticDimension

Yep. When you find all the cells are not displaying with showSkeleton(), please set the estimatedRowHeight. Otherwise, they won't show it!!! I think it's better to put this into README. @Juanpe Maybe a Q&A part.

Juanpe commented 2 years ago

Hi @XiaoxiaYao, you're right. Actually, this info is already in the README file:

Screenshot 2021-08-25 at 18 57 24

But, yes, I agree with you that a Q&A or FAQ section could be very useful. Feel free to create it :)