neo
neo

Reputation: 1404

How to configure stackview with dynamic content inside UITableViewCell?

I have UITableViewCell which looks like CardView. Inside cell, I should display some dynamic content. That is why I have stackview inside my cell that will have my dynamic content. But the problem is that cellForRowAt method is called every time while scrolling and stackview starts having extra elements.

How should I solve this problem? How I handled problem by myself?

I found prepareForReuse method of UITableViewCell which is called before re-configuring by cell. In that method, I clean my stackView. And now, my stackview will not have extra views. But, it is too bad for performance. The next way I tried is holding some flag inside my cell that tells me was stackview already configured. But, this approach didn't help (yes, it will not add extra elements, but content inside cells gets incorrect placement) as checking stackview length.

Here is my pseudo-code:

/// called in cellForRowAt
func configure(item: Item) {
    item.forEach {
        stackView.addArrangedSubview(ItemView(item))
    }
}

func prepareForReuse() {
    stackView.arrangedSubviews.forEach {
         $0.removeFromSuperView()
    }
}

Upvotes: 0

Views: 620

Answers (1)

Blazej SLEBODA
Blazej SLEBODA

Reputation: 9935

If the prepareForReuse and dequeuing methods leads to exceeding 0.0167 sec (60 frames per second) then maybe in your edge case it will be better to create a cell instead of dequeuing it.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = UITableViewCell()
    cell.configure(item: item)
    return cell
}

Upvotes: 1

Related Questions