Skip to content

Instantly share code, notes, and snippets.

@dodikk
Last active December 13, 2016 11:19
Show Gist options
  • Save dodikk/f993dca3e4d4da3c4b630747f8e2f310 to your computer and use it in GitHub Desktop.
Save dodikk/f993dca3e4d4da3c4b630747f8e2f310 to your computer and use it in GitHub Desktop.
MVVM router example
@interface HPQuizRouter
- (void)navigateToSelectedQuiz:(id<HPQuizState>)quizState from:(UIViewController*)screen;
- (void)prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender;
@end
@implementation HPQuizRouter
- (void)navigateToSelectedQuiz:(id<HPQuizState>)quizState from:(UIViewController*)screen
{
// wraps segue ids. They should not appear in the client code
if ([quizState isCompleted])
{
[screen performSegueWithIdentifier:kSegueToAlreadyCompletedQuizScreen sender:screen];
}
else
{
[screen performSegueWithIdentifier:kSegueToSelectedQuiz sender:screen];
}
}
- (void)prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:kSegueToSelectedQuiz])
{
MySelectedQuizVC* nextVC = objc_member_of_cast<MySelectedQuizVC>(segue.destinationController);
nextVC.viewModel = [MyFactory buildVmForXYZ];
nextVC.router = [MySelectedQuizVCRouter new];
}
}
@end
@interface QuizQuestionVC : UIViewController
// to be injected
@property (nonatomic, strong) HPQuizRouter* quizRouter;
@property (nonatomic, strong) id<HPQuizListVM> quizVM;
@end
- (void)tableView:(UITableView*)tableView
didSelectRowAtIndexPath:(NSIndexPath*)indexPath
{
// user's action
[self.router navigateToSelectedQuiz:self];
}
-(void)viewModelDidLoadSomethingAndShouldNavigate:(id)myViewModel
{
// data flow driven
[self.router navigateToSelectedQuiz:self];
}
- (void)prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender
{
// navigation logic and dependency injection delegated to a separate class
[self.router prepareForSegue:segue sender:self];
}
- (void)viewDidLoad
{
[super viewDidLoad];
// lights out if injection has not been done properly
NSParameterAssert(nil != self.quizRouter);
NSParameterAssert(nil != self.quizVM);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment