C4 навигация назад и вперед между подпредставлениями
Я снова чувствую себя глупо, но мне не удается перемещаться между подпредставлениями моего проекта. Я могу добавить столько подпредставлений, сколько захочу, до тех пор, пока они будут идти вперед, но как только я захочу вернуться к одному из посещенных ранее просмотров, у меня возникнет проблема... вот мой упрощенный код:
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
1 ответ
Я думаю, вы слишком усложнили процедуру.
"Контроль" того, какое подпредставление должно быть выполнено содержащим контроллером представления, поэтому, если два вида находятся на холсте, то это должен быть холст, который имеет дело с переключением вместо самих объектов.
Что поможет улучшить ваш подход:
- Избавьтесь от ссылок на холст из подклассов.
- Представления ваших подчиненных контроллеров все постят
touchesBegan
уведомления... Используйте их в рабочей области, т.е.[self listenFor:@"touchesBegan" fromObject:firstOrSecondView.canvas and runMethod:@"switch:"];
- Переключите путем изменения
zPosition
или скрывая / раскрывая соответствующий вид...
Я сократил ваши реализации до следующего:
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
Это должно работать для вас в том случае, если ваши взгляды нуждаются в различной функциональности, например FirstView
будет иметь существенно отличную внутреннюю функциональность, чем SecondView
... Если они одинаковы, вам следует подумать о том, чтобы объединить их в один и тот же подкласс.