How to push two view controllers but animate transition only for the second one?

Solution 1:

The solution you're looking for if you're in the firstVC:

NSMutableArray *controllers = [self.navigationController.viewControllers mutableCopy];
[controllers addObject:secondVc];
[controllers addObject:thirdVC];
[self.navigationController setViewControllers:controllers animated:YES];

This will animate in the thirdVC without the secondVc becoming visible in the process. When the user press the back button, they will return to the secondVc

Solution 2:

To preserve the standard animation for pushing a view controller, in Swift:

let pushVC = UIViewController()
let backVC = UIViewController()

if let navigationController = navigationController {

  navigationController.pushViewController(pushVC, animated: true)

  let stackCount = navigationController.viewControllers.count
  let addIndex = stackCount - 1
  navigationController.viewControllers.insert(backVC, atIndex: addIndex)

}

This displays pushVC normally and inserts backVC into the navigation stack, preserving both the animation and the history for the UINavigationController.

You can use setViewControllers, but you'll lose the standard push animation.