 <p>What you are looking for is <code>UINavigationControllerDelegate</code>.</p> <p>I believe the method that gives you the message you need is </p> <pre><code>- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated; </code></pre> <p>And </p> <pre><code>- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated; </code></pre> <p>In your CustomViewController, you are going to want to conform to the <code>UINavigationControllerDelegate</code> protocol like this:</p> <pre><code>@interface CustomViewController : UIViewController &lt;UINavigationControllerDelegate&gt; </code></pre> <p>And then override the delegate methods above to get the messages you are looking for.</p> <p>Here is an complete implementation in Swift:</p> <pre><code>import UIKit class ViewController: UIViewController, UINavigationControllerDelegate { override func viewDidLoad() { super.viewDidLoad() navigationController?.delegate = self } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) { println(viewController) } } class FirstViewController: ViewController { } class SecondViewController: ViewController { } </code></pre>