December 15, 2019

Hide row/cells in Static UITableView with Swift

Hide row/cells in Static UITableView with Swift

Static UITableView's have very specific use cases. Some of these use cases can be menu's or the settings of your app. These two examples would generally have static content, but that doesn't mean that they should not be able to change based on user input.

One such example could be when a user turns a setting on or off. This user interaction could allow for more options to be displayed, for eg, on your settings page you might have certain settings that will only be shown if the user has a premium account.

In this tutorial we will learn how to show and hide rows/cells in a static UITableView. I am going to do a basic setup of a static UITableView, if you want more information or want to know how use a custom cell in a static UITableView, you can take a look at this tutorial.

Step 1: Create static UITableView

If you already have a static tableview setup, you can skip to Step 2.

A static UITableView requires us to use a TableViewController. The first thing that we will do is to remove the current ViewController in our Interface Builder and replace it with a UITableViewController.

To do this, click on the ViewController in the structure area in Interface Builder, and then delete it:

Once we have this deleted we can add our TableViewController. Interface Builder should look like this once you have added in the TableViewController:

Now that we have added this, we need to set it as our initial view controller, to do that click on the bar above the TableViewController, and then in the Attributes Inspector check the Is Initial View Controller checkbox. See below image:

Now that we have done all of that, we need to make this TableViewController static, and then we need to update our ViewController class to inherit from UITableViewController instead of UIViewController. Once we have updated the inheritance, we can set the class for TableViewController using Interface Builder.

Change TableViewController to static. To do this, click on Table View in the Structure Area, then click on Attributes inspector and select Static Cells from the Content dropdown, as seen in the below image:

We can now update our ViewController to inherit from UITableViewController. Update your ViewController code to look like this:

class ViewController: UITableViewController

Next we need to use this ViewController and set it as the custom class for our TableViewController in Interface Builder. See images:

And then we can set the Class to ViewController:

The next thing that we need to do is to add some more static cells. To do this, click on the Table View Section in the Structure area. In the Attributes inspector change the number of rows to 5. See image:

The final task for this is to add a label to each cell. Each label will have a different value, I will be using, First, Second, Third, Fourth, Fifth. See below image:

We can now build and run the app to make sure that everything is showing up correctly. If you build and run the app it should look like this:

Step 2: Hide the static row/cell

Hiding a row/cell is super simple. All we have to do is set the row/cell height. Luckily for us, UITableViewController already has this method built in.

Add the following code to your ViewController:

override func tableView(_ tableView: UITableView, 
                        heightForRowAt indexPath: IndexPath) -> CGFloat {
    if indexPath.row == 2 {
        return 0
    }
        
    return tableView.rowHeight
}

For demonstration purposes I have just set the height where indexPath.row == 2 to 0.

If you build and run the app you will see that the cell where the label had Third as its text is hidden:

That is all that you need to do to hide a cell in a static table view. In the next step I will show you how to hide a row/cell when you tap on it.

Step 3: Hide tapped row/cell

In order to hide the row/cell that we tap on, we will need to store the index path. Lets add a new property to our ViewController called tappedIndexPath:

var tappedIndexPath: IndexPath?

We can now add the didSelectRowAt method to our ViewController. This is another build in method that will allow us to do something when a cell is tapped.

In this example we will store the index path of the row/cell that gets tapped and we will reload the tableview.

Add the following code to your ViewController:

override func tableView(_ tableView: UITableView, 
                        didSelectRowAt indexPath: IndexPath) {
    self.tappedIndexPath = indexPath
    self.tableView.reloadData()
}

The last part of this is to update our heightForRowAt method. Update the heightForRowAt method to look like the following:

override func tableView(_ tableView: UITableView, 
                        heightForRowAt indexPath: IndexPath) -> CGFloat {
    if let selectedIndexPath = self.tappedIndexPath,
           indexPath.row == selectedIndexPath.row {
        return 0
    }
        
    return tableView.rowHeight
}

The if statement has been updated to unwrap the optional tappedIndexPath property and use the unwrapped value to assign a value to selectedIndexPath. We then use the row property from selectedIndexPath to hide the row that we tapped on.

Conclusion

Getting the static tableview is the most difficult part of this, once that is done, hiding and row/cell is really simple.

The full source code can be found here.