Is it a good idea to have multiple derivations of Presenter (MVP) / View Model (MVVM) of a certain view and supply them externally?

So, I've an iOS project that needed to be revamped and added with a routing / navigation logic between views. We have 3 ways as the entry point of the routing: manually, push notification, and deeplink. I am using MVP and I was thinking that maybe I will just have 3 different presenters for each entry point. Eg. we will have HomePresenting protocol for the HomeViewController and it will have HomePresenter: HomePresenting, PushNotificationHomePresenter: HomePresenting, DeeplinkHomePresenter: HomePresenting. And the Coordinator / Router / Navigator class will just set this presenter based on the type of entry point like so: function navigate(to screen: ScreenType, routeType: RouteType) { .... if screen == .home { let vc = HomeViewController(nibName: "HomeViewController", bundle: Bundle.main) if routeType == .manual { let presenter = HomePresenter(delegate: vc) vc.presenter = presenter } else if routeType == .deeplink { let presenter = DeeplinkHomePresenter(delegate: vc) vc.presenter = presenter } else if routeType == .pushNotif { let presenter = PushNotificationHomePresenter(delegate: vc) vc.presenter = presenter } navigationController?.pushViewController(vc, animated: true) } .... } The reason for this is that the logic between those entry point might be different. For instance: a product subscription deeplink will just directly open the SubscriptionViewController if there is no product saved in the local Realm database in the device. But if it found a product, it will just open HomeViewController and show a message "You have subscribed to product xxx." While if we go to the HomeViewController manually, there won't be any logic to check this up. Is this a good idea? Also, the same question with MVVM as in can I just set the View Model from the Coordinator etc? Thank you.

May 21, 2025 - 09:10
 0

So, I've an iOS project that needed to be revamped and added with a routing / navigation logic between views. We have 3 ways as the entry point of the routing: manually, push notification, and deeplink. I am using MVP and I was thinking that maybe I will just have 3 different presenters for each entry point. Eg. we will have HomePresenting protocol for the HomeViewController and it will have HomePresenter: HomePresenting, PushNotificationHomePresenter: HomePresenting, DeeplinkHomePresenter: HomePresenting. And the Coordinator / Router / Navigator class will just set this presenter based on the type of entry point like so:

function navigate(to screen: ScreenType, routeType: RouteType) {
    ....
    
    if screen == .home {
        let vc = HomeViewController(nibName: "HomeViewController", bundle: Bundle.main)
        if routeType == .manual {
            let presenter = HomePresenter(delegate: vc)
            vc.presenter = presenter
        } else if routeType == .deeplink {
            let presenter = DeeplinkHomePresenter(delegate: vc)
            vc.presenter = presenter
        } else if routeType == .pushNotif {
            let presenter = PushNotificationHomePresenter(delegate: vc)
            vc.presenter = presenter
        }
        navigationController?.pushViewController(vc, animated: true)
    }

    ....
}

The reason for this is that the logic between those entry point might be different. For instance: a product subscription deeplink will just directly open the SubscriptionViewController if there is no product saved in the local Realm database in the device. But if it found a product, it will just open HomeViewController and show a message "You have subscribed to product xxx." While if we go to the HomeViewController manually, there won't be any logic to check this up.

Is this a good idea? Also, the same question with MVVM as in can I just set the View Model from the Coordinator etc?

Thank you.