Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
signalapp
GitHub Repository: signalapp/Signal-iOS
Path: blob/main/SignalUI/Utils/TablePreviewViewController.swift
1 views
//
// Copyright 2025 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//

import UIKit

#if DEBUG

/// A minimal `UITableViewController` for displaying `UITableViewCell`s in Xcode
/// `#Previews`.
open class TablePreviewViewController: UITableViewController {

    private let cellBlock: (UITableView) -> [UITableViewCell]
    private var cells: [UITableViewCell] = []

    public init(
        style: UITableView.Style = .plain,
        cellBlock: @escaping (UITableView) -> [UITableViewCell],
    ) {
        self.cellBlock = cellBlock
        super.init(style: style)
    }

    @available(*, unavailable)
    public required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override public func viewDidLoad() {
        super.viewDidLoad()
        cells = cellBlock(tableView)
    }

    // MARK: UITableViewDataSource

    override public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return cells.count
    }

    override public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        return cells[indexPath.row]
    }
}

@available(iOS 17, *)
#Preview {
    TablePreviewViewController { _ in
        return (0..<5).map { i in
            let cell = UITableViewCell()
            var content = cell.defaultContentConfiguration()
            content.text = "Row \(i)"
            cell.contentConfiguration = content
            return cell
        }
    }
}

#endif