Skip to content

Commit 4ec96e0

Browse files
author
Ian Outterside
committed
Removed backing store that was mirroring uiviewcontroller childviewcontrollers, relying on childviewcontrollers only now
1 parent 2b6e7dd commit 4ec96e0

File tree

3 files changed

+16
-57
lines changed

3 files changed

+16
-57
lines changed

IAOViewControllerStack/IAOViewControllerStack/IAOViewControllerStack/UIViewController+IAOUIViewControllerStack.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,5 @@
2020
- (void)popToRootViewControllerAnimated:(BOOL)animated completion:(void(^)(void))success;
2121

2222
- (UIViewController *)rootViewControllerForNavigationStack;
23-
- (NSMutableArray *)viewControllerStack;
2423

2524
@end

IAOViewControllerStack/IAOViewControllerStack/IAOViewControllerStack/UIViewController+IAOUIViewControllerStack.m

Lines changed: 12 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
#import <objc/runtime.h>
1111

1212
static 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

IAOViewControllerStack/IAOViewControllerStack/TestViewController.m

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,29 +49,27 @@ - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interface
4949
- (IBAction)addViewControllerPressed:(id)sender {
5050

5151
UIViewController *rootViewController = [self rootViewControllerForNavigationStack];
52-
NSArray *array = [rootViewController viewControllerStack];
53-
5452
TestViewController *testViewController = [[TestViewController alloc] initWithNibName:@"TestViewController" bundle:[NSBundle mainBundle]];
55-
testViewController.title = [NSString stringWithFormat:@"%i", [array count]];
53+
testViewController.title = [NSString stringWithFormat:@"%i", [rootViewController.childViewControllers count]];
5654

5755
NSLog(@"Saving %@", testViewController.title);
5856

5957
[self pushViewController:testViewController animated:YES completion:^{
60-
NSLog(@"%@",[rootViewController viewControllerStack]);
58+
NSLog(@"%@",[rootViewController childViewControllers]);
6159
}];
6260
}
6361

6462
- (IBAction)removeViewControllerPressed:(id)sender {
6563
[self popViewControllerAnimated:YES completion:^{
6664
UIViewController *rootViewController = [self rootViewControllerForNavigationStack];
67-
NSLog(@"%@",[rootViewController viewControllerStack]);
65+
NSLog(@"%@",[rootViewController childViewControllers]);
6866
}];
6967
}
7068

7169
- (IBAction)rootViewControllerPressed:(id)sender {
7270
[self popToRootViewControllerAnimated:YES completion:^{
7371
UIViewController *rootViewController = [self rootViewControllerForNavigationStack];
74-
NSLog(@"%@",[rootViewController viewControllerStack]);
72+
NSLog(@"%@",[rootViewController childViewControllers]);
7573
}];
7674
}
7775

0 commit comments

Comments
 (0)