From 9c4b4ba44e38f23d45d0e4f42cb852ebed76b2ca Mon Sep 17 00:00:00 2001 From: Adeel Miraj Date: Wed, 26 Jul 2017 12:12:40 +0500 Subject: [PATCH] Added the functionality to select and child view controller programatically and set the default view controller other than 0 when instantiating the instance of this class --- .../YSLContainerViewController.h | 6 +- .../YSLContainerViewController.m | 15 +++- .../project.pbxproj | 18 ++-- .../contents.xcworkspacedata | 7 ++ YSLContainerViewControllerDemo/ArtistsCell.m | 1 + .../Base.lproj/Main.storyboard | 82 ++++++++++++++++--- .../ContainerViewController.h | 18 ++++ ...Controller.m => ContainerViewController.m} | 28 +++++-- .../InitialViewController.h | 16 ++++ .../InitialViewController.m | 51 ++++++++++++ YSLContainerViewControllerDemo/PlayListCell.m | 1 + .../ViewController.h | 15 ---- 12 files changed, 212 insertions(+), 46 deletions(-) create mode 100644 YSLContainerViewControllerDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 YSLContainerViewControllerDemo/ContainerViewController.h rename YSLContainerViewControllerDemo/{ViewController.m => ContainerViewController.m} (70%) create mode 100644 YSLContainerViewControllerDemo/InitialViewController.h create mode 100644 YSLContainerViewControllerDemo/InitialViewController.m delete mode 100644 YSLContainerViewControllerDemo/ViewController.h diff --git a/YSLContainerViewController/YSLContainerViewController.h b/YSLContainerViewController/YSLContainerViewController.h index 0b65c5f..7a9b185 100644 --- a/YSLContainerViewController/YSLContainerViewController.h +++ b/YSLContainerViewController/YSLContainerViewController.h @@ -22,6 +22,8 @@ @property (nonatomic, strong, readonly) NSMutableArray *titles; @property (nonatomic, strong, readonly) NSMutableArray *childControllers; +@property (nonatomic, readonly) NSUInteger currentIndex; + @property (nonatomic, strong) UIFont *menuItemFont; @property (nonatomic, strong) UIColor *menuItemTitleColor; @property (nonatomic, strong) UIColor *menuItemSelectedTitleColor; @@ -30,6 +32,8 @@ - (id)initWithControllers:(NSArray *)controllers topBarHeight:(CGFloat)topBarHeight - parentViewController:(UIViewController *)parentViewController; + parentViewController:(UIViewController *)parentViewController + withCurrentIndex:(NSUInteger)currentIndex; +- (void)selectViewControllerAtIndex:(NSUInteger)index; @end diff --git a/YSLContainerViewController/YSLContainerViewController.m b/YSLContainerViewController/YSLContainerViewController.m index d05cc78..9dc677a 100644 --- a/YSLContainerViewController/YSLContainerViewController.m +++ b/YSLContainerViewController/YSLContainerViewController.m @@ -14,7 +14,7 @@ @interface YSLContainerViewController () @property (nonatomic, assign) CGFloat topBarHeight; -@property (nonatomic, assign) NSInteger currentIndex; +@property (nonatomic, readwrite) NSUInteger currentIndex; @property (nonatomic, strong) YSLScrollMenuView *menuView; @end @@ -24,6 +24,7 @@ @implementation YSLContainerViewController - (id)initWithControllers:(NSArray *)controllers topBarHeight:(CGFloat)topBarHeight parentViewController:(UIViewController *)parentViewController + withCurrentIndex:(NSUInteger)currentIndex { self = [super init]; if (self) { @@ -32,8 +33,6 @@ - (id)initWithControllers:(NSArray *)controllers [self didMoveToParentViewController:parentViewController]; _topBarHeight = topBarHeight; - _titles = [[NSMutableArray alloc] init]; - _childControllers = [[NSMutableArray alloc] init]; _childControllers = [controllers mutableCopy]; NSMutableArray *titles = [NSMutableArray array]; @@ -41,7 +40,9 @@ - (id)initWithControllers:(NSArray *)controllers [titles addObject:[vc valueForKey:@"title"]]; } _titles = [titles mutableCopy]; + _currentIndex = currentIndex; } + return self; } @@ -91,7 +92,12 @@ - (void)viewDidLoad { [self.view addSubview:_menuView]; [_menuView setShadowView]; - [self scrollMenuViewSelectedIndex:0]; +// self.currentIndex = 0; + [self scrollMenuViewSelectedIndex:self.currentIndex]; +} + +- (void)selectViewControllerAtIndex:(NSUInteger)index { + [self scrollMenuViewSelectedIndex:index]; } #pragma mark -- private @@ -114,6 +120,7 @@ - (void)setChildViewControllerWithCurrentIndex:(NSInteger)currentIndex } } } + #pragma mark -- YSLScrollMenuView Delegate - (void)scrollMenuViewSelectedIndex:(NSInteger)index diff --git a/YSLContainerViewControllerDemo.xcodeproj/project.pbxproj b/YSLContainerViewControllerDemo.xcodeproj/project.pbxproj index c0e6677..19c61bc 100644 --- a/YSLContainerViewControllerDemo.xcodeproj/project.pbxproj +++ b/YSLContainerViewControllerDemo.xcodeproj/project.pbxproj @@ -7,9 +7,10 @@ objects = { /* Begin PBXBuildFile section */ + 04C799481F286DFF00D5D456 /* InitialViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 04C799471F286DFF00D5D456 /* InitialViewController.m */; }; D098129D1AC165570085833D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D098129C1AC165570085833D /* main.m */; }; D09812A01AC165570085833D /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = D098129F1AC165570085833D /* AppDelegate.m */; }; - D09812A31AC165570085833D /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D09812A21AC165570085833D /* ViewController.m */; }; + D09812A31AC165570085833D /* ContainerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D09812A21AC165570085833D /* ContainerViewController.m */; }; D09812A61AC165570085833D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D09812A41AC165570085833D /* Main.storyboard */; }; D09812A81AC165570085833D /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D09812A71AC165570085833D /* Images.xcassets */; }; D09812AB1AC165570085833D /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = D09812A91AC165570085833D /* LaunchScreen.xib */; }; @@ -49,13 +50,15 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 04C799461F286DFF00D5D456 /* InitialViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InitialViewController.h; sourceTree = ""; }; + 04C799471F286DFF00D5D456 /* InitialViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = InitialViewController.m; sourceTree = ""; }; D09812971AC165570085833D /* YSLContainerViewControllerDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = YSLContainerViewControllerDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; D098129B1AC165570085833D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; D098129C1AC165570085833D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; D098129E1AC165570085833D /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; D098129F1AC165570085833D /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - D09812A11AC165570085833D /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; - D09812A21AC165570085833D /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; + D09812A11AC165570085833D /* ContainerViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ContainerViewController.h; sourceTree = ""; }; + D09812A21AC165570085833D /* ContainerViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ContainerViewController.m; sourceTree = ""; }; D09812A51AC165570085833D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; D09812A71AC165570085833D /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; D09812AA1AC165570085833D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; @@ -139,8 +142,10 @@ D09812CD1AC27EB70085833D /* cells */, D098129E1AC165570085833D /* AppDelegate.h */, D098129F1AC165570085833D /* AppDelegate.m */, - D09812A11AC165570085833D /* ViewController.h */, - D09812A21AC165570085833D /* ViewController.m */, + 04C799461F286DFF00D5D456 /* InitialViewController.h */, + 04C799471F286DFF00D5D456 /* InitialViewController.m */, + D09812A11AC165570085833D /* ContainerViewController.h */, + D09812A21AC165570085833D /* ContainerViewController.m */, D09812A41AC165570085833D /* Main.storyboard */, D09812A71AC165570085833D /* Images.xcassets */, D09812A91AC165570085833D /* LaunchScreen.xib */, @@ -350,8 +355,9 @@ buildActionMask = 2147483647; files = ( D09812F11AC288440085833D /* SampleViewController.m in Sources */, - D09812A31AC165570085833D /* ViewController.m in Sources */, + D09812A31AC165570085833D /* ContainerViewController.m in Sources */, D09812A01AC165570085833D /* AppDelegate.m in Sources */, + 04C799481F286DFF00D5D456 /* InitialViewController.m in Sources */, D09812E71AC2849B0085833D /* ArtistsViewController.m in Sources */, D098129D1AC165570085833D /* main.m in Sources */, D09812EC1AC285520085833D /* ArtistsCell.m in Sources */, diff --git a/YSLContainerViewControllerDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/YSLContainerViewControllerDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/YSLContainerViewControllerDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/YSLContainerViewControllerDemo/ArtistsCell.m b/YSLContainerViewControllerDemo/ArtistsCell.m index cccfc4d..95e890a 100644 --- a/YSLContainerViewControllerDemo/ArtistsCell.m +++ b/YSLContainerViewControllerDemo/ArtistsCell.m @@ -12,6 +12,7 @@ @implementation ArtistsCell - (void)awakeFromNib { // Initialization code + [super awakeFromNib]; } - (void)setSelected:(BOOL)selected animated:(BOOL)animated { diff --git a/YSLContainerViewControllerDemo/Base.lproj/Main.storyboard b/YSLContainerViewControllerDemo/Base.lproj/Main.storyboard index 0d2ede1..9a3ecac 100644 --- a/YSLContainerViewControllerDemo/Base.lproj/Main.storyboard +++ b/YSLContainerViewControllerDemo/Base.lproj/Main.storyboard @@ -1,28 +1,38 @@ - - + + + + + - + + - + - - + - + - + - + + + + + + + + - + @@ -33,12 +43,62 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/YSLContainerViewControllerDemo/ContainerViewController.h b/YSLContainerViewControllerDemo/ContainerViewController.h new file mode 100644 index 0000000..bed471d --- /dev/null +++ b/YSLContainerViewControllerDemo/ContainerViewController.h @@ -0,0 +1,18 @@ +// +// ContainerViewController.h +// YSLContainerViewControllerDemo +// +// Created by yamaguchi on 2015/03/24. +// Copyright (c) 2015年 h.yamaguchi. All rights reserved. +// + +#import + +@interface ContainerViewController : UIViewController + +@property (nonatomic, nonnull) NSNumber *defaultIndex; + +- (IBAction)goToNextViewController:(id _Nullable)sender; + +@end + diff --git a/YSLContainerViewControllerDemo/ViewController.m b/YSLContainerViewControllerDemo/ContainerViewController.m similarity index 70% rename from YSLContainerViewControllerDemo/ViewController.m rename to YSLContainerViewControllerDemo/ContainerViewController.m index 47774e9..060967d 100644 --- a/YSLContainerViewControllerDemo/ViewController.m +++ b/YSLContainerViewControllerDemo/ContainerViewController.m @@ -1,22 +1,24 @@ // -// ViewController.m +// ContainerViewController.m // YSLContainerViewControllerDemo // // Created by yamaguchi on 2015/03/24. // Copyright (c) 2015年 h.yamaguchi. All rights reserved. // -#import "ViewController.h" +#import "ContainerViewController.h" #import "YSLContainerViewController.h" #import "PlayListTableViewController.h" #import "ArtistsViewController.h" #import "SampleViewController.h" -@interface ViewController () +@interface ContainerViewController () + +@property (strong, nonatomic) YSLContainerViewController *container; @end -@implementation ViewController +@implementation ContainerViewController - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; @@ -54,13 +56,21 @@ - (void)viewDidLoad { float statusHeight = [[UIApplication sharedApplication] statusBarFrame].size.height; float navigationHeight = self.navigationController.navigationBar.frame.size.height; - YSLContainerViewController *containerVC = [[YSLContainerViewController alloc]initWithControllers:@[playListVC,artistVC,sampleVC1,sampleVC2,sampleVC3] + self.container = [[YSLContainerViewController alloc]initWithControllers:@[playListVC,artistVC,sampleVC1,sampleVC2,sampleVC3] topBarHeight:statusHeight + navigationHeight - parentViewController:self]; - containerVC.delegate = self; - containerVC.menuItemFont = [UIFont fontWithName:@"Futura-Medium" size:16]; + parentViewController:self + withCurrentIndex:self.defaultIndex.integerValue]; + self.container.delegate = self; + self.container.menuItemFont = [UIFont fontWithName:@"Futura-Medium" size:16]; + + [self.view addSubview:self.container.view]; +} + +- (IBAction)goToNextViewController:(id)sender { - [self.view addSubview:containerVC.view]; + NSInteger currentIndex = self.container.currentIndex; + NSInteger nextIndex = (++currentIndex >= self.container.childControllers.count) ? 0 : currentIndex; + [self.container selectViewControllerAtIndex:nextIndex]; } #pragma mark -- YSLContainerViewControllerDelegate diff --git a/YSLContainerViewControllerDemo/InitialViewController.h b/YSLContainerViewControllerDemo/InitialViewController.h new file mode 100644 index 0000000..acaab8f --- /dev/null +++ b/YSLContainerViewControllerDemo/InitialViewController.h @@ -0,0 +1,16 @@ +// +// InitialViewController.h +// YSLContainerViewControllerDemo +// +// Created by Adeel Miraj on 26/07/2017. +// Copyright © 2017 h.yamaguchi. All rights reserved. +// + +#import + +@interface InitialViewController : UIViewController + +- (IBAction)onTapFirstViewControllerButton:(UIButton *)sender; +- (IBAction)onTapSecondViewControllerButton:(UIButton *)sender; + +@end diff --git a/YSLContainerViewControllerDemo/InitialViewController.m b/YSLContainerViewControllerDemo/InitialViewController.m new file mode 100644 index 0000000..1dae767 --- /dev/null +++ b/YSLContainerViewControllerDemo/InitialViewController.m @@ -0,0 +1,51 @@ +// +// InitialViewController.m +// YSLContainerViewControllerDemo +// +// Created by Adeel Miraj on 26/07/2017. +// Copyright © 2017 h.yamaguchi. All rights reserved. +// + +#import "InitialViewController.h" +#import "ContainerViewController.h" + +@interface InitialViewController () + +@end + +@implementation InitialViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view. +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +/* +#pragma mark - Navigation + +// In a storyboard-based application, you will often want to do a little preparation before navigation +- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { + // Get the new view controller using [segue destinationViewController]. + // Pass the selected object to the new view controller. +} +*/ + +- (IBAction)onTapFirstViewControllerButton:(UIButton *)sender { + [self performSegueWithIdentifier:@"ContainerSegue" sender:[NSNumber numberWithInteger:0]]; +} + +- (IBAction)onTapSecondViewControllerButton:(UIButton *)sender { + [self performSegueWithIdentifier:@"ContainerSegue" sender:[NSNumber numberWithInteger:1]]; +} + +- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { + ContainerViewController *containerVC = (ContainerViewController *)segue.destinationViewController; + containerVC.defaultIndex = sender; +} + +@end diff --git a/YSLContainerViewControllerDemo/PlayListCell.m b/YSLContainerViewControllerDemo/PlayListCell.m index d21a934..e770172 100644 --- a/YSLContainerViewControllerDemo/PlayListCell.m +++ b/YSLContainerViewControllerDemo/PlayListCell.m @@ -12,6 +12,7 @@ @implementation PlayListCell - (void)awakeFromNib { // Initialization code + [super awakeFromNib]; } - (void)setSelected:(BOOL)selected animated:(BOOL)animated { diff --git a/YSLContainerViewControllerDemo/ViewController.h b/YSLContainerViewControllerDemo/ViewController.h deleted file mode 100644 index beba808..0000000 --- a/YSLContainerViewControllerDemo/ViewController.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// ViewController.h -// YSLContainerViewControllerDemo -// -// Created by yamaguchi on 2015/03/24. -// Copyright (c) 2015年 h.yamaguchi. All rights reserved. -// - -#import - -@interface ViewController : UIViewController - - -@end -