GithubHelp home page GithubHelp logo

Modules integration about viperit HOT 3 CLOSED

ferranabello avatar ferranabello commented on July 28, 2024
Modules integration

from viperit.

Comments (3)

ferranabello avatar ferranabello commented on July 28, 2024 1

Hey @BorysShcherbyna,
let's say you have a parent module which has a child module, this child module needs some data to load properly. This child module is some kind of selector. The user will tap into something and you want to know what is it that the user selected.

To do that you could do something like this:

final class ParentRouter: Router {
    func showParentModule(from: UIViewController, withData: Any) {
        show(from: from, embedInNavController: true, setupData: withData)
    }
    
    func showChildModule(withData: Any, onSelect: @escaping (String) -> Void) {
        let myChild = AppModules.child.build()
        let childRouter = myChild.router as! ChildRouter
        childRouter.showChild(ofParent: _view, insideContainer: _view.view, withData: "Show this", onSelection: onSelect)
    }
}

final class ParentPresenter: Presenter {
    var childData: String!
    
    override func setupView(data: Any) {
        //Do whatever you need to setup and save it
        childData = data as! String
    }
    
    override func viewHasLoaded() {
        super.viewHasLoaded()
        
        //Now we are ready to show the child
        router.showChildModule(withData: childData) { selectedValue in
            //COOL! Now I can use the value coming from my child module in the parent module!
        }
    }
}

final class ChildRouter: Router {
    private var executeIHaveSelectedSomeString: ((String) -> Void)!
    
    func showChild(ofParent: UIViewController, insideContainer: UIView, withData: Any, onSelection: @escaping (String) -> Void) {
        show(from: ofParent, insideView: insideContainer, setupData: withData)
        executeIHaveSelectedSomeString = onSelection
    }
    
    func iHaveSelected(theValue: String) {
        executeIHaveSelectedSomeString(theValue)
    }
}

You could go with other solutions, using Rx observables instead of closures but I think you get the point.

Cheers!

from viperit.

ferranabello avatar ferranabello commented on July 28, 2024

HI @BorysShcherbyna,
I think the best way to do integrations of parent/child is to do it on a router function. Viperit has one convenience method to do so in the Router:

func show(from containerView: UIViewController, insideView targetView: UIView, setupData: Any?)

Anyway, this is just an example. Viperit gives you the opportunity to implement this as you want.

Cheers!

from viperit.

BorysShcherbyna avatar BorysShcherbyna commented on July 28, 2024

Thank you for pointing to Router!

This is my assumption on module integration:

let parentModule = AppModules.parent.build()
let parentPresenter = parentModule.presenter as! ParentPresenter
let parentView = parentModule.view as! ParentView

let childModule = AppViewModules.profileHeader.build()
let childPresenter = childModule.presenter as! ChildPresenter

//next two lines are for establishing communication between modules
parentPresenter.childPresenter = childPresenter 
childPresenter.delegate = parentPresenter

profileHeaderModule.router.show(from: parentPresenter.view, insideView: parentView.headerView, setupData: dataToPass)

parentPresenter.router.show(from: _view, setupData: dataToPass)

What do you think about such module integration? And what is your suggestion for communication between modules?

Thanks!

from viperit.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.