How Do I Add a Custom View Controller to a ContainerViewController?

ContainerViewController supports adding your custom UIViewController subclass as one of its contained child view controllers. You can use the ContainerViewController(controllers:titles:) initializer to add the controller or add it using the addViewController(_:) API.

You can also just display text instead of an image in the segment control by setting the title (UIViewController.title) on the controller you’re trying to add without conforming to the SegmentImageProviding protocol.

Ensure you have at least the title property on your UIViewController set; otherwise, the controller won’t show up in the segment control above. Additionally, the custom view controllers added shouldn’t change navigationItem’s bar button items:

// The custom `UIViewController` subclass conforming to the `SegmentImageProviding` protocol.
class SegmentImageProvidingContainedController: UIViewController, SegmentImageProviding {
    var segmentImage: UIImage? {
        return UIImage(named: "myCustomImage")

// Adding custom view controllers to a `ContainerViewController`.

// Will display the image returned by `segmentImage` in the segment control.
let segmentImageProvidingController = SegmentImageProvidingContainedController()
segmentImageProvidingController.view.backgroundColor = UIColor.systemRed

// Will display text instead of an image in the segment control.
let titleProvidingController = UIViewController()
titleProvidingController.title = "TitleProvidingController"
titleProvidingController.view.backgroundColor = UIColor.systemGreen

let containerController = ContainerViewController(controllers: [segmentImageProvidingController, titleProvidingController], titles: nil)