Search code examples
iosswiftuistackview

UITableView not shown inside UIStackView


I have a UIStackView where it can show a label, image, table view or nothing based on user selection. Here is my current hierarchy for the dynamic view:

  • UIStackView_Parent
    • UILabel - some text, fixed view
    • UIStackView_Child - this is the container that can show multiple things or nothing
    • UIView - another fixed view

When I call UIStackView_Child.addArrangedSubview(...) with a label or image it works perfectly, but addArrangedSubview(tableView) does not show the table. I have tableView.scrollEnabled = false and set frame to fixed height based on number of cell and defined the table's cellHeight.

Any help would be much appreciated, thanks!


Solution

  • That's because stackview tries to compress content as much as possible. When you initally add a tableview, I'm assuming it has no content, so stackview compresses the width to 0 because it has nothing to show. You have to do one of two things:

    After the table gets populated with data, you have to set the tableView's frame. I do this by calculating how big each cell is going to be. I know the width is going to be as big as the view that contains stackview. So it winds up being something like

    let estimatedHeight = tableView.numberOfRows(inSection: 0) //You may need to modify as necessary
    let width = parentView.frame.size.width
    tableView.frame = CGRect(x: 0, y: 0, width: width, height: estimatedHeight)
    

    Once you set the tableView's frame, stackview should automatically adjust.