1010#import < objc/runtime.h>
1111
1212static char kIAOROOTVIEWCONTROLLER_IDENTIFIER ;
13- static char kIAOVIEWCONTROLLERSTACK_IDENTIFIER ;
1413
1514@implementation UIViewController (IAOUIViewControllerStack)
1615
@@ -22,24 +21,15 @@ - (void)pushViewController:(UIViewController *)controller animated:(BOOL)animate
2221
2322 UIViewController *rootViewController = [self rootViewControllerForNavigationStack ];
2423
25- NSMutableArray *viewControllerStack = [rootViewController viewControllerStack ];
26-
27- if (!viewControllerStack) {
28- viewControllerStack = [NSMutableArray arrayWithCapacity: 1 ];
29- objc_setAssociatedObject (rootViewController, &kIAOVIEWCONTROLLERSTACK_IDENTIFIER , viewControllerStack, OBJC_ASSOCIATION_RETAIN );
30- }
31-
32- // Set the viewcontrollers root view controller property
3324 objc_setAssociatedObject (controller, &kIAOROOTVIEWCONTROLLER_IDENTIFIER , rootViewController, OBJC_ASSOCIATION_ASSIGN );
3425
35- [rootViewController addChildViewController: controller];
36-
3726 BOOL previousClip = rootViewController.view .clipsToBounds ;
3827 rootViewController.view .clipsToBounds = YES ;
3928
4029 // Transition
41- if ([viewControllerStack count ] > 0 ) {
42- UIViewController *previousViewController = [viewControllerStack objectAtIndex: ([viewControllerStack count ] - 1 )];
30+ if ([rootViewController.childViewControllers count ] > 0 ) {
31+ UIViewController *previousViewController = [rootViewController.childViewControllers objectAtIndex: ([rootViewController.childViewControllers count ] - 1 )];
32+ [rootViewController addChildViewController: controller];
4333
4434 if (animated) {
4535 controller.view .frame = CGRectMake (rootViewController.view .bounds .origin .x + rootViewController.view .bounds .size .width , rootViewController.view .bounds .origin .y , controller.view .frame .size .width , controller.view .frame .size .height );
@@ -58,8 +48,6 @@ - (void)pushViewController:(UIViewController *)controller animated:(BOOL)animate
5848 } completion: ^(BOOL finished) {
5949 [controller didMoveToParentViewController: rootViewController];
6050
61- // Add the viewcontroller to the stack
62- [viewControllerStack addObject: controller];
6351 rootViewController.view .clipsToBounds = previousClip;
6452
6553 if (success) {
@@ -70,10 +58,6 @@ - (void)pushViewController:(UIViewController *)controller animated:(BOOL)animate
7058 else {
7159 void (^addBlock)(void ) = ^{
7260 [controller didMoveToParentViewController: rootViewController];
73-
74- // Add the viewcontroller to the stack
75- [viewControllerStack addObject: controller];
76-
7761 rootViewController.view .clipsToBounds = previousClip;
7862
7963 if (success) {
@@ -82,6 +66,7 @@ - (void)pushViewController:(UIViewController *)controller animated:(BOOL)animate
8266 };
8367
8468 controller.view .frame = rootViewController.view .bounds ;
69+ [rootViewController addChildViewController: controller];
8570 [rootViewController.view addSubview: controller.view];
8671
8772 if (animated) {
@@ -118,21 +103,19 @@ - (void)popViewControllerAnimated:(BOOL)animated completion:(void (^)(void))succ
118103 return ;
119104 }
120105
121- NSMutableArray *viewControllerStack = [rootViewController viewControllerStack ];
122-
123106 BOOL previousClip = rootViewController.view .clipsToBounds ;
124107 rootViewController.view .clipsToBounds = YES ;
125108
126109 // Cant pop if we have no children
127- if (!viewControllerStack || [viewControllerStack count ] == 0 ) {
110+ if ([rootViewController.childViewControllers count ] == 0 ) {
128111 return ;
129112 }
130113
131- UIViewController *topViewController = [viewControllerStack objectAtIndex: ([viewControllerStack count ] - 1 )];
114+ UIViewController *topViewController = [rootViewController.childViewControllers objectAtIndex: ([rootViewController.childViewControllers count ] - 1 )];
132115
133116 // Move between top and next child
134- if ([viewControllerStack count ] > 1 ) {
135- UIViewController *nextChildViewController = [viewControllerStack objectAtIndex: ([viewControllerStack count ] - 2 )];
117+ if ([rootViewController.childViewControllers count ] > 1 ) {
118+ UIViewController *nextChildViewController = [rootViewController.childViewControllers objectAtIndex: ([rootViewController.childViewControllers count ] - 2 )];
136119
137120 [topViewController willMoveToParentViewController: nil ];
138121
@@ -152,7 +135,6 @@ - (void)popViewControllerAnimated:(BOOL)animated completion:(void (^)(void))succ
152135
153136 } completion: ^(BOOL finished) {
154137 [topViewController removeFromParentViewController ];
155- [viewControllerStack removeObject: topViewController];
156138 rootViewController.view .clipsToBounds = previousClip;
157139
158140 if (success) {
@@ -165,11 +147,8 @@ - (void)popViewControllerAnimated:(BOOL)animated completion:(void (^)(void))succ
165147 [topViewController willMoveToParentViewController: nil ];
166148 [topViewController.view removeFromSuperview ];
167149 [topViewController removeFromParentViewController ];
168- [viewControllerStack removeObject: topViewController];
169150 rootViewController.view .clipsToBounds = previousClip;
170151
171- objc_setAssociatedObject (rootViewController, &kIAOVIEWCONTROLLERSTACK_IDENTIFIER , nil , OBJC_ASSOCIATION_RETAIN );
172-
173152 if (success) {
174153 success ();
175154 }
@@ -203,36 +182,29 @@ - (void)popToRootViewControllerAnimated:(BOOL)animated completion:(void (^)(void
203182 return ;
204183 }
205184
206- NSMutableArray *viewControllerStack = [rootViewController viewControllerStack ];
207-
208185 BOOL previousClip = rootViewController.view .clipsToBounds ;
209186 rootViewController.view .clipsToBounds = YES ;
210187
211188 // Cant pop if we have no children
212- if (!viewControllerStack || [viewControllerStack count ] == 0 ) {
189+ if ([rootViewController.childViewControllers count ] == 0 ) {
213190 return ;
214191 }
215192
216- UIViewController *topViewController = [viewControllerStack objectAtIndex: ([viewControllerStack count ] - 1 )];
217- [viewControllerStack removeObject: topViewController];
193+ UIViewController *topViewController = [rootViewController.childViewControllers objectAtIndex: ([rootViewController.childViewControllers count ] - 1 )];
218194
219- while ([viewControllerStack count ] > 0 ) {
220- UIViewController *controller = [viewControllerStack objectAtIndex: ([viewControllerStack count ] - 1 )];
195+ while ([rootViewController.childViewControllers count ] > 1 ) {
196+ UIViewController *controller = [rootViewController.childViewControllers objectAtIndex: ([rootViewController.childViewControllers count ] - 2 )];
221197
222198 [controller willMoveToParentViewController: nil ];
223199 [controller removeFromParentViewController ];
224- [viewControllerStack removeObject: controller];
225200 }
226201
227202 void (^removeBlock)(void ) = ^{
228203 [topViewController willMoveToParentViewController: nil ];
229204 [topViewController.view removeFromSuperview ];
230205 [topViewController removeFromParentViewController ];
231- [viewControllerStack removeObject: topViewController];
232206 rootViewController.view .clipsToBounds = previousClip;
233207
234- objc_setAssociatedObject (rootViewController, &kIAOVIEWCONTROLLERSTACK_IDENTIFIER , nil , OBJC_ASSOCIATION_RETAIN );
235-
236208 if (success) {
237209 success ();
238210 }
@@ -263,14 +235,4 @@ - (UIViewController *)rootViewControllerForNavigationStack {
263235 }
264236}
265237
266- - (NSMutableArray *)viewControllerStack {
267- UIViewController *rootViewController = [self rootViewControllerForNavigationStack ];
268-
269- if (rootViewController != self) {
270- return nil ;
271- }
272-
273- return (NSMutableArray *)objc_getAssociatedObject (self, &kIAOVIEWCONTROLLERSTACK_IDENTIFIER );
274- }
275-
276238@end
0 commit comments