According to the docs, the delegate is called just before the navigation controller displays a viewController’s view and navigationItem properties.
But, it appears that your question is, "how?".
In your Storyboard or somewhere in code, the UINavigationController is set up.  Wherever that is, it has a delegate property (a variable).  That property is set to some object that implements the UINavigationControllerDelegate protocol.
For example:
MySpecialViewController *myViewController = [[MySpecialViewController alloc] init];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:myViewController];
navigationController.delegate = self;
Now, whenever that navigationController is about to present a view controller, the navigationController:willShowViewController:animated: delegate method will be called on your object.