Comments (3)
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.
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.
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)
- mark embedInNavigationController() as open not public HOT 1
- SwiftUI weak linking HOT 6
- Provider injection HOT 6
- One view, multiple modules
- Build storyboard issue HOT 1
- AppModule.build() crashes app HOT 4
- Viperit: Unexpectedly found nil while implicitly unwrapping an Optional value HOT 3
- ViperIt unable to compile with Xcode 13 HOT 3
- please fix swiftlint issues in template HOT 1
- Compile error in pod on Xcode 10 beta 5 HOT 2
- Installation HOT 4
- Use module with view variants HOT 1
- Support UITableViewController HOT 3
- Dependency Injection (Swinject) HOT 2
- Modally presentation styles HOT 2
- How to test modules? HOT 2
- Support TableViewController? HOT 1
- How to push uiViewcontroller? HOT 4
- How to pass data between Modules?
- Using MDCTabBarViewController with Viperit? HOT 10
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from viperit.