Just leaving this out here incase any one wants to use a defined protocol to navigate around and change view controllers programatically.
@objc protocol AppWalkThroughDelegate {
  @objc optional func goNextPage(forwardTo position: Int)
  @objc optional func goPreviousPage(fowardTo position: Int)
}
Use the above protocol and confirm to root UIPageViewController to manage navigation between view controllers.
Example below:
class AppWalkThroughViewController: UIPageViewController, UIPageViewControllerDataSource, AppWalkThroughDelegate {
    // Add list of view controllers you want to load
    var viewControllerList : [UIViewControllers] = {
       let firstViewController = FirstViewController()
       let secondViewController = SecondViewController() 
       // Assign root view controller as first responder
       secondViewController.delegate = self  
       let thirdViewController = ThirdViewController() 
       
    }
    override func viewDidLoad() {
       super.viewDidLoad()
    }
    
    // Navigate to next page 
    func goNextPage(fowardTo position: Int) {
       let viewController = self.viewControllerList[position]
       setViewControllers([viewController], direction: 
       UIPageViewControllerNavigationDirection.forward, animated: true, completion: nil)
    }
    }
Once achieved all that, child view controllers that need to make UIPageViewController move to next or previous page can use AppWalkThroughDelegate methods by passing a specific number onto delegate property.
Example below: Delegate method invoked once button pressed
    class SecondViewController: UIViewController {
       
        var delegate: AppWalkThroughDelegate!
        
        override func viewDidLoad() {
           super.viewDidLoad()
        }
         @IBAction func goNextPage(_ sender: Any) {
            // Can be any number but not outside viewControllerList bounds 
            delegate.goNextPage!(fowardTo: 2)
         }
    }