QuickBirdEng/XCoordinator

Trigger a NavigationCoordinator inside a Page Coordinator

Daniebro5 opened this issue · 2 comments

I'm trying to trigger a second coordinator as follows:

StepsListRoute: Route {
  case otherCoordinator
}

class StepsPageCoordinator: PageCoordinator<StepsListRoute> {
  
  override func prepareTransition(for route: StepsListRoute) -> PageTransition {
    switch route {
    case .insuranceOptions:
      let coordinator = otherCoordinator(rootViewController: self.rootViewController)
      return .trigger(OtherRoute.some, on: coordinator)
    }
  }
}

But I'm seeing "Cannot convert value of type 'UIPageViewController' to expected argument type 'NavigationCoordinator.RootViewController' (aka 'UINavigationController')". What am I doing wrong?

I could be wrong but if .trigger(OtherRoute.some, on: coordinator) does not return PageTransition type which the overridden function is expecting, you're likely going to get an error of this type.

I believe this is because PageTransition is an alias for Transition<UIPageViewController> and I'm betting that your .trigger(OtherRoute.some, on: coordinator) returns a NavigationTransition which doesn't match the expected return type.

Hey @Daniebro5 !

In the line let coordinator = otherCoordinator(rootViewController: self.rootViewController), you are trying to create a NavigationCoordinator (or a subclass thereof) with a rootViewController of UIPageViewController instead of UINavigationController.

To give a little bit more context:

Each coordinator has a rootViewController it is managing. In the case of a PageCoordinator this is a UIPageViewController, for NavigationCoordinator this is a UINavigationController. When a route is triggered, a transition is created, which is then performed on this exact rootViewController.

Since in your example code, you are trying to create a NavigationCoordinator with a UIPageViewController, the compiler is trying to tell you that not all of the UINavigationController capabilities are available for UIPageViewController (for example pushViewController).

In a normal case, you would probably simply initialize the NavigationCoordinator without specifying a rootViewController (it will simply create one itself then), or specify one - e.g. let coordinator = otherCoordinator(rootViewController: UINavigationController())