import UIKit
protocol Coordinator {
func start()
}
class MainCoordinator: Coordinator {
let navigationController: UINavigationController
init(navigationController: UINavigationController) {
self.navigationController = navigationController
}
func start() {
let homeVC = HomeViewController()
homeVC.coordinator = self
navigationController.pushViewController(homeVC, animated: false)
}
func showDetails() {
let detailsVC = DetailsViewController()
navigationController.pushViewController(detailsVC, animated: true)
}
}
class HomeViewController: UIViewController {
var coordinator: MainCoordinator?
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
title = "Home"
let button = UIButton(type: .system)
button.setTitle("Go to Details", for: .normal)
button.translatesAutoresizingMaskIntoConstraints = false
button.addTarget(self, action: #selector(goToDetailsTapped), for: .touchUpInside)
view.addSubview(button)
NSLayoutConstraint.activate([
button.centerXAnchor.constraint(equalTo: view.centerXAnchor),
button.centerYAnchor.constraint(equalTo: view.centerYAnchor)
])
}
@objc func goToDetailsTapped() {
coordinator?.showDetails()
}
}
class DetailsViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
title = "Details"
let label = UILabel()
label.text = "Details Screen"
label.font = UIFont.systemFont(ofSize: 24, weight: .medium)
label.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(label)
NSLayoutConstraint.activate([
label.centerXAnchor.constraint(equalTo: view.centerXAnchor),
label.centerYAnchor.constraint(equalTo: view.centerYAnchor)
])
}
}
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var coordinator: MainCoordinator?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let navController = UINavigationController()
coordinator = MainCoordinator(navigationController: navController)
coordinator?.start()
window = UIWindow(frame: UIScreen.main.bounds)
window?.rootViewController = navController
window?.makeKeyAndVisible()
return true
}
}
This app uses the Coordinator pattern to separate navigation logic from view controllers. The MainCoordinator manages the navigation stack using a UINavigationController. It starts by showing the HomeViewController, which has a button labeled 'Go to Details'. When the button is tapped, it calls the coordinator's showDetails() method, which pushes the DetailsViewController onto the navigation stack. The back button in the navigation bar is automatically provided by UINavigationController, allowing the user to return to the Home screen. This pattern keeps view controllers simple and focused on UI, while the coordinator handles navigation flow.