Используйте следующее:
navigationController?.setViewControllers(navigationArray!, animated: true)
Например:
guard let navigationController = self.navigationController else { return }
var navigationArray = navigationController.viewControllers
navigationArray.remove(at: navigationArray.count - 2)
navigationController.setViewControllers(navigationArray!, animated: true)
Из документов :
Используйте этот метод для обновленияили замените текущий стек контроллера представления без явного нажатия или выталкивания каждого контроллера.Кроме того, этот метод позволяет обновлять набор контроллеров без анимации изменений, что может быть целесообразно во время запуска, когда требуется вернуть контроллер навигации в предыдущее состояние.
Если анимации включены, этот методрешает, какой тип перехода выполнять, основываясь на том, находится ли последний элемент в массиве элементов в стеке навигации.Если контроллер представления в настоящее время находится в стеке, но не является самым верхним элементом, этот метод использует всплывающий переход;если это самый верхний элемент, переход не выполняется.Если контроллер представления не находится в стеке, этот метод использует push-переход.Выполняется только один переход, но когда этот переход завершается, все содержимое стека заменяется новыми контроллерами представления.Например, если контроллеры A, B и C находятся в стеке, и вы устанавливаете контроллеры D, A и B, этот метод использует pop-переход, и результирующий стек содержит контроллеры D, A и B.
Редактировать 1
Когда вы нажимаете VC5, используйте следующий код
let vc = YourVC5()
var array = navigationController?.viewControllers
array?.removeLast()
array?.append(vc)
navigationController?.setViewControllers(array!, animated: true)
Идея состоит в том, когда вы помещаете VC5 в стекперед нажатием мы исключаем VC4 из списка, таким образом, по умолчанию VC3 будет ниже VC5, и вам просто нужно вызвать navigationController? .popViewController (animated: true), и он должен появиться непосредственно в VC3