Skip to main content
Enable users to start new 1:1 or group chats in your iOS app using CometChat’s UIKit for iOS by integrating the CreateConversationVC screen.

Overview

The CreateConversation component enables users to:
  • Browse CometChat users and groups via native list components
  • Search within users and groups
  • Toggle between “Users” and “Groups” tabs using a segmented control
  • Swipe between lists with a UIPageViewController
  • Navigate to MessagesVC upon selecting a user or group

Prerequisites

Before implementing this feature, ensure you have:
  • Completed Getting Started setup
  • CometChat UIKit v5+ installed via CocoaPods or Swift Package Manager
  • User authenticated with CometChatUIKit.login() before presenting this screen
  • A UINavigationController embedded in your flow
  • MessagesVC implemented to handle chat screens

Components

ComponentDescription
UISegmentedControlSwitches between “Users” and “Groups” tabs
UIPageViewControllerEnables swipe navigation between list views
CometChatUsersDisplays the list of CometChat users
CometChatGroupsDisplays the list of CometChat groups
MessagesVCChat interface, launched upon item selection
searchControllerProvides search for both users and groups
CometChatThemeApplies theming (colors, fonts) for UI consistency
CometChatTypographyDefines text styles for segment labels

Integration Steps

Step 1: Present the Create Conversation Screen

Push CreateConversations to allow starting a chat:
import UIKit
import CometChatSDK

class HomeViewController: UIViewController {
    
    func showCreateConversation() {
        // Initialize the create conversation view controller
        let createVC = CreateConversationVC()
        
        // Push onto navigation stack
        navigationController?.pushViewController(createVC, animated: true)
    }
}
This provides the entry point to the create-conversation flow. File reference: HomeScreenViewController.swift

Step 2: Set Up the User Interface

Build the segmented control and page view controller:
import UIKit
import CometChatUIKitSwift

class CreateConversationVC: UIViewController {
    
    private var segmentedControl: UISegmentedControl!
    private var pageViewController: UIPageViewController!
    private var usersViewController: CometChatUsers!
    private var groupsViewController: CometChatGroups!
    
    override public func viewDidLoad() {
        super.viewDidLoad()
        
        // Set up segmented control, page view controller, and search
        buildUI()
        setupPageViewController()
        
        // Add target for segment changes
        segmentedControl.addTarget(
            self,
            action: #selector(segmentChanged(_:)),
            for: .valueChanged
        )
        
        // Set initial search controller
        navigationItem.searchController = usersViewController.searchController
    }
    
    private func buildUI() {
        // Configure segmented control and page view
    }
    
    private func setupPageViewController() {
        // Initialize page view controller with users and groups
    }
}
This initializes the UI elements and search integration. File reference: CreateConversations.swift

Step 3: Configure Segmented Control Navigation

Toggle between user and group lists when the segment changes:
@objc public func segmentChanged(_ sender: UISegmentedControl) {
    let index = sender.selectedSegmentIndex
    
    // Determine navigation direction
    let direction: UIPageViewController.NavigationDirection = index == 0 ? .reverse : .forward
    
    // Update search controller based on selected tab
    navigationItem.searchController = (index == 0)
        ? usersViewController.searchController
        : groupsViewController.searchController
    
    // Navigate to the selected page
    pageViewController.setViewControllers(
        [pages[index]],
        direction: direction,
        animated: true
    )
}
This keeps the proper search bar and view in sync with the selected tab. File reference: CreateConversations.swift

Step 4: Handle Item Selection

Navigate to MessagesVC when a user or group is tapped:
// Users list with tap handler
public lazy var usersViewController: CometChatUsers = {
    let vc = CometChatUsers()
    
    // Handle user selection
    vc.set(onItemClick: { [weak self] user, _ in
        let chatVC = MessagesVC()
        chatVC.user = user
        self?.navigationController?.pushViewController(chatVC, animated: true)
    })
    
    // Keep navigation bar visible during search
    vc.searchController.hidesNavigationBarDuringPresentation = false
    
    return vc
}()

// Groups list with tap handler
public lazy var groupsViewController: CometChatGroups = {
    let vc = CometChatGroups()
    
    // Handle group selection
    vc.set(onItemClick: { [weak self] group, _ in
        let chatVC = MessagesVC()
        chatVC.group = group
        self?.navigationController?.pushViewController(chatVC, animated: true)
    })
    
    // Keep navigation bar visible during search
    vc.searchController.hidesNavigationBarDuringPresentation = false
    
    return vc
}()
This routes the user to the appropriate chat screen. File reference: CreateConversations.swift

Step 5: Manage Page View Transitions

Implement data source and delegate for smooth swiping:
// MARK: - UIPageViewControllerDataSource
extension CreateConversationVC: UIPageViewControllerDataSource {
    
    public func pageViewController(
        _ pvc: UIPageViewController,
        viewControllerBefore vc: UIViewController
    ) -> UIViewController? {
        guard let idx = pages.firstIndex(of: vc), idx > 0 else { return nil }
        return pages[idx - 1]
    }
    
    public func pageViewController(
        _ pvc: UIPageViewController,
        viewControllerAfter vc: UIViewController
    ) -> UIViewController? {
        guard let idx = pages.firstIndex(of: vc), idx < pages.count - 1 else { return nil }
        return pages[idx + 1]
    }
}

// MARK: - UIPageViewControllerDelegate
extension CreateConversationVC: UIPageViewControllerDelegate {
    
    public func pageViewController(
        _ pvc: UIPageViewController,
        didFinishAnimating finished: Bool,
        previousViewControllers: [UIViewController],
        transitionCompleted completed: Bool
    ) {
        // Sync segmented control with current page
        if completed,
           let current = pvc.viewControllers?.first,
           let idx = pages.firstIndex(of: current) {
            segmentedControl.selectedSegmentIndex = idx
        }
    }
}
This synchronizes the segmented control with page swipes. File reference: CreateConversations.swift

Customization Options

Segment Styling

Use CometChatTheme to customize tint and font:
segmentedControl.selectedSegmentTintColor = CometChatTheme.palette.primary
segmentedControl.setTitleTextAttributes([
    .font: CometChatTypography.body,
    .foregroundColor: UIColor.white
], for: .selected)

Labels

Localize or rebrand “USERS” / “GROUPS” labels:
segmentedControl.setTitle("Contacts", forSegmentAt: 0)
segmentedControl.setTitle("Teams", forSegmentAt: 1)
Adjust searchController.placeholder and styling:
usersViewController.searchController.searchBar.placeholder = "Search contacts..."
groupsViewController.searchController.searchBar.placeholder = "Search teams..."

Edge Cases

ScenarioHandling
Live searchBuilt-in in CometChatUsers and CometChatGroups
Empty statesComponents display default “no results” views
Segment disabledHide tabs if only one list is relevant

Error Handling

Error TypeSolution
Load errorsUse setErrorView() on list components
Navigation failuresPresent an alert if push fails
Blocked usersIntercept in onItemClick to prevent navigation

Feature Matrix

FeatureImplementation
Show create screenshowCreateConversation()
Tabbed listsUISegmentedControl + UIPageViewController
Display usersCometChatUsers()
Display groupsCometChatGroups()
Search functionalitysearchController
Navigate to chatMessagesVC(user:) / MessagesVC(group:)