UITableView in UIKit

UITableView is one of the most versatile and widely used components in the UIKit framework. It provides a way to present data in a structured list format, making it ideal for displaying large sets of data in a scrollable and organized manner.

article

Understanding UITableView in iOS Development


UITableView is one of the most versatile and widely used components in the UIKit framework. It provides a way to present data in a structured list format, making it ideal for displaying large sets of data in a scrollable and organized manner. In this article, we will explore what UITableViews are, the various functionalities they offer, and provide practical code examples to demonstrate how you can implement and customize them to display local data in your iOS projects.


What is a UITableView?


A UITableView is a subclass of UIScrollView that displays a single column of vertically scrolling content, divided into rows. Each row in a UITableView is represented by a UITableViewCell, and the table can be divided into sections, each containing a different number of rows. UITableViews are commonly used to present lists of items, such as contacts, messages, or settings options.


UITableViews offer a wide range of functionalities and customization options. Here are some key things you can do with UITableViews:


  • Display Lists: Present lists of items in a structured and scrollable format.
  • Custom Cells: Create custom UITableViewCell subclasses to display complex data and custom layouts.
  • Sections: Organize data into sections with headers and footers for better organization.
  • Data Management: Use UITableViewDataSource and UITableViewDelegate protocols to manage and display data dynamically.
  • Interactivity: Add interactivity to rows with selection, editing, and accessory views.

Implementing UITableView in Swift


Let's dive into some code examples to see how you can create, customize, and work with UITableViews in Swift, focusing on displaying local data.


To create a simple UITableView, you can initialize it and set its data source and delegate. Here is an example:


import UIKit

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    let tableView = UITableView()
    let data = ["Item 1", "Item 2", "Item 3", "Item 4", "Item 5"]

    override func viewDidLoad() {
        super.viewDidLoad()

        // Set up the UITableView
        tableView.translatesAutoresizingMaskIntoConstraints = false
        tableView.dataSource = self
        tableView.delegate = self
        self.view.addSubview(tableView)

        // Set Auto Layout constraints
        NSLayoutConstraint.activate([
            tableView.topAnchor.constraint(equalTo: self.view.topAnchor),
            tableView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor),
            tableView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor),
            tableView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor)
        ])
    }

    // UITableViewDataSource Methods
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return data.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell") ?? UITableViewCell(style: .default, reuseIdentifier: "cell")
        cell.textLabel?.text = data[indexPath.row]
        return cell
    }

    // UITableViewDelegate Methods
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("Selected \(data[indexPath.row])")
    }
}

In this example, we create a UITableView and set its data source and delegate to the view controller. The data source methods tableView(_:numberOfRowsInSection:) and tableView(_:cellForRowAt:) are implemented to provide the data for the table view. The delegate method tableView(_:didSelectRowAt:) is used to handle row selection.


Customizing UITableViewCells


You can customize the appearance and content of UITableViewCells to display more complex data. Here is an example of creating a custom UITableViewCell subclass and using it in a UITableView:


import UIKit

class CustomTableViewCell: UITableViewCell {
    let customLabel = UILabel()
    let customImageView = UIImageView()

    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        
        // Set up the custom label
        customLabel.translatesAutoresizingMaskIntoConstraints = false
        contentView.addSubview(customLabel)

        // Set up the custom image view
        customImageView.translatesAutoresizingMaskIntoConstraints = false
        contentView.addSubview(customImageView)

        // Set Auto Layout constraints
        NSLayoutConstraint.activate([
            customImageView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 10),
            customImageView.centerYAnchor.constraint(equalTo: contentView.centerYAnchor),
            customImageView.widthAnchor.constraint(equalToConstant: 40),
            customImageView.heightAnchor.constraint(equalToConstant: 40),
            
            customLabel.leadingAnchor.constraint(equalTo: customImageView.trailingAnchor, constant: 10),
            customLabel.centerYAnchor.constraint(equalTo: contentView.centerYAnchor),
            customLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10)
        ])
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    let tableView = UITableView()
    let data = ["Item 1", "Item 2", "Item 3", "Item 4", "Item 5"]

    override func viewDidLoad() {
        super.viewDidLoad()

        // Set up the UITableView
        tableView.translatesAutoresizingMaskIntoConstraints = false
        tableView.dataSource = self
        tableView.delegate = self
        tableView.register(CustomTableViewCell.self, forCellReuseIdentifier: "customCell")
        self.view.addSubview(tableView)

        // Set Auto Layout constraints
        NSLayoutConstraint.activate([
            tableView.topAnchor.constraint(equalTo: self.view.topAnchor),
            tableView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor),
            tableView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor),
            tableView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor)
        ])
    }

    // UITableViewDataSource Methods
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return data.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "customCell", for: indexPath) as! CustomTableViewCell
        cell.customLabel.text = data[indexPath.row]
        cell.customImageView.image = UIImage(systemName: "star")
        return cell
    }

    // UITableViewDelegate Methods
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("Selected \(data[indexPath.row])")
    }
}

In this example, we create a custom UITableViewCell subclass named CustomTableViewCell with a label and an image view. The view controller registers this custom cell class with the table view and configures each cell with text and an image in the tableView(_:cellForRowAt:) method.


Using Sections in UITableView


UITableViews can be divided into sections, each containing a different number of rows. Here is an example of creating a UITableView with multiple sections:


import UIKit

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    let tableView = UITableView()
    let data = [
        ["Item 1", "Item 2", "Item 3"],
        ["Item 4", "Item 5", "Item 6", "Item 7"],
        ["Item 8", "Item 9"]
    ]
    let sectionTitles = ["Section 1", "Section 2", "Section 3"]

    override func viewDidLoad() {
        super.viewDidLoad()

        // Set up the UITableView
        tableView.translatesAutoresizingMaskIntoConstraints = false
        tableView.dataSource = self
        tableView.delegate = self
        self.view.addSubview(tableView)

        // Set Auto Layout constraints
        NSLayoutConstraint.activate([
            tableView.topAnchor.constraint(equalTo: self.view.topAnchor),
            tableView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor),
            tableView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor),
            tableView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor)
        ])
    }

    // UITableViewDataSource Methods
    func numberOfSections(in tableView: UITableView) -> Int {
        return data.count
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return data[section].count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell") ?? UITableViewCell(style: .default, reuseIdentifier: "cell")
        cell.textLabel?.text = data[indexPath.section][indexPath.row]
        return cell
    }

    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return sectionTitles[section]
    }

    // UITableViewDelegate Methods
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("Selected \(data[indexPath.section][indexPath.row])")
    }
}

In this example, we create a UITableView with multiple sections. The data source methods numberOfSections(in:) and tableView(_:numberOfRowsInSection:) are implemented to provide the number of sections and rows in each section. The tableView(_:titleForHeaderInSection:) method is used to set the title for each section header.


Conclusion


UITableViews are powerful and versatile components for displaying data in a structured list format. In this article, we've covered the basics of what UITableViews are, their various functionalities, and provided practical code examples to help you implement and customize them to display local data in your iOS projects. From creating simple table views to customizing cells and using sections, mastering UITableViews is essential for building dynamic and user-friendly interfaces.


Understanding and effectively utilizing UITableViews can significantly enhance your app's data presentation and user experience. Experiment with different UITableView properties and techniques to create dynamic and engaging list displays in your iOS applications.

instructor

Exodai INSTRUCTOR!

Johan t'Sas

Owner and Swift developer!