I feel silly again but I don't manage to navigate back and forth between the subviews of my project. I can add as many subviews as I want as long as it just goes forward, but as soon as I want to come back to one of the views previously visited I have a problem... here is my simplified code:
C4Workspace.h
#import "C4CanvasController.h"
#import "FirstView.h"
@interface C4WorkSpace : C4CanvasController{
FirstView *firstView;
}
@end
C4Workspace.m
#import "C4Workspace.h"
@implementation C4WorkSpace
-(void)setup {
firstView=[FirstView new];
firstView.canvas.frame=CGRectMake(0, 0, self.canvas.width, self.canvas.height);
firstView.canvas.userInteractionEnabled=YES;
[firstView setup];
firstView.mainCanvas=self.canvas;
[self.canvas addSubview:firstView.canvas];
}
@end
FirstView.h
#import "C4CanvasController.h"
#import "SecondView.h"
@interface FirstView : C4CanvasController{
C4Label *goToSecondView;
SecondView *secondView;
}
@property (readwrite, strong) C4Window *mainCanvas;
@end
FirstView.m
#import "FirstView.h"
@implementation FirstView
-(void)setup{
goToSecondView=[C4Label labelWithText:@"go to second View"];
goToSecondView.origin=CGPointMake(20, 50);
[self.canvas addLabel:goToSecondView];
[self listenFor:@"touchesBegan" fromObject:goToSecondView andRunMethod:@"goToSecondView"];
}
-(void)goToSecondView{
[goToSecondView removeFromSuperview];
C4Log(@"second view");
secondView=[SecondView new];
secondView.canvas.frame=CGRectMake(0, 0, self.canvas.width, self.canvas.height);
secondView.canvas.userInteractionEnabled=YES;
[secondView setup];
secondView.mainCanvas=self.canvas;
[self.canvas addSubview:secondView.canvas];
}
@end
SecondView.h
#import "C4CanvasController.h"
#import "FirstView.h"
@interface SecondView : C4CanvasController{
C4Label *goToFirstView;
FirstView *firstView;
}
@property (readwrite, strong) C4Window *mainCanvas;
@end
SecondView.m
#import "SecondView.h"
@implementation SecondView
-(void)setup{
goToFirstView=[C4Label labelWithText:@"go to First View"];
goToFirstView.origin=CGPointMake(20, 50);
[self.canvas addLabel:goToFirstView];
[self listenFor:@"touchesBegan" fromObject:goToFirstView andRunMethod:@"goToFirstView"];
}
-(void)goToFirstView{
[goToFirstView removeFromSuperview];
C4Log(@"first view");
firstview=[FirstView new];
firstview.canvas.frame=CGRectMake(0, 0, self.canvas.width, self.canvas.height);
firstView.canvas.userInteractionEnabled=YES;
[firstView setup];
firstView.mainCanvas=self.canvas;
[self.canvas addSubview:firstView.canvas];
}
@end
I think you're over complicating the procedure.
The "control" of which subview should be done by the containing view controller, so, if the two views are on the canvas then it should be the canvas that deals with the switching instead of the objects themselves.
Thing to help improve your approach:
touchesBegan
notifications... Use these in the workspace i.e. [self listenFor:@"touchesBegan" fromObject:firstOrSecondView.canvas and runMethod:@"switch:"];
zPosition
or hiding / revealing the appropriate view...I reduced your implementations to the following:
FirstView.m
#import "FirstView.h"
@implementation FirstView
-(void)setup{
goToSecondView=[C4Label labelWithText:@"go to second View"];
goToSecondView.origin=CGPointMake(20, 50);
[self.canvas addLabel:goToSecondView];
goToSecondView.userInteractionEnabled = NO;
}
@end
SecondView.m
#import "SecondView.h"
@implementation SecondView
-(void)setup{
goToFirstView=[C4Label labelWithText:@"go to First View"];
goToFirstView.origin=CGPointMake(20, 50);
[self.canvas addLabel:goToFirstView];
goToFirstView.userInteractionEnabled = NO;
}
@end
C4WorkSpace.m
#import "C4Workspace.h"
#import "FirstView.h"
#import "SecondView.h"
@implementation C4WorkSpace {
FirstView *firstView;
SecondView *secondView;
}
-(void)setup {
firstView=[FirstView new];
firstView.canvas.frame = self.canvas.frame;
[firstView setup];
firstView.canvas.userInteractionEnabled = YES;
[self.canvas addSubview:firstView.canvas];
secondView=[SecondView new];
secondView.canvas.frame = self.canvas.frame;
[secondView setup];
secondView.canvas.userInteractionEnabled = YES;
[self.canvas addSubview:secondView.canvas];
secondView.canvas.hidden = YES;
[self listenFor:@"touchesBegan"
fromObjects:@[firstView.canvas, secondView.canvas]
andRunMethod:@"switchView:"];
}
-(void)switchView:(NSNotification *)aNotification {
C4View *v = (C4View *)aNotification.object;
if([v isEqual:firstView.canvas]) {
firstView.canvas.hidden = YES;
secondView.canvas.hidden = NO;
} else {
firstView.canvas.hidden = NO;
secondView.canvas.hidden = YES;
}
}
@end
This should work for you in the case that your views need differing functionality, like FirstView
will have significantly different internal functionality than SecondView
... If they are the same then you should think about collapsing them into the same subclass.